2016-03-28 24 views
2

kullanırken:mockito NullPointerException Böyle Mockito kullanmaya çalışıyorum herhangi

Mockito.when(Mockito.any(ObjectMapper.class).readValue(Mockito.any(BufferedReader.class),Mockito.any(Class.class))).thenReturn(new Person("1","abc")); 

Bu Jackson kütüphanesinden olduğunu. Ben bu kod noktaya sefer oluşturulan nesnelerin bir ton olduğundan

public <T> T readValue(Reader src, Class<T> valueType) 

Yapıyorum nedenidir. Her adımda alay etmek zaman alacaktır.

Kod bu mockito bildirimine ulaştığında NPE almamın bir nedeni var mı?

Yığın İzleme:

java.lang.NullPointerException 
    at com.prashant.flax.ShellTest.givenDirectoryHasFiles(ShellTest.java:139) 
    at com.prashant.flax.ShellTest.testExecute(ShellTest.java:61) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:48) 
    at org.junit.rules.RunRules.evaluate(RunRules.java:20) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:160) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 

Eğer (bu yöntem sadece bu kod parçası vardır) belirli bir yöntemde ise görebiliyorum, böylece hata ayıklama, orada ve çöker üzerine ulaşır ederken görebileceğiniz gibi.

+0

NPE numaranızın Stacktrace mesajını ekle –

+1

Belirli bir sahte nesne üzerinde saplamak zorundasın - Ne zaman yapabileceğine inanmıyorum (any (T.class) ....) '. –

+0

Bu benim de tahminim. Ama derleyici şikayetçi değil, o yüzden sormama izin vermiştim. – Prashant

cevap

4

Oliver, yorumlarda belirtildiği gibi, tüm nesnelerin gerçekleşmesi için when uygulayamazsınız. Mockito alt sınıflama yoluyla çalışır, bu nedenle mock, spy veya @Mock veya @Spy ek açıklamalarını kullanarak bir örnek oluşturmak zorundasınız; davranışı özelleştirmek; ve daha sonra sahte using dependency injection or other similar tricks'u yükleyin. neden bu any() için dönüş değeri aslında null olduğunu olmuyor gelince


; any gibi eşleştiriciler yalnızca when ve verify için argümanlar olarak kullanılmalıdır ve Mockito "herhangi bir Sınıfı" temsil eden özel bir örnek Class oluşturamaz, bu nedenle Mockito bir kukla değer (null) döndürür ve verileri özel bir yığında depolar argüman eşleştiriciler. Mockito'nun sizi bu duruma karşı uyarması için daha iyi hata mesajları olsa da, Mockito'dan önceki NPE kodunuz size kullanım örnekleri ile uygun bir istisna sunabilir.

Eşleyici döndürme değerleri ve yığını hakkında daha fazla bilgi için, "How do Mockito matchers work?" adresindeki diğer SO yanıtıma bakın.

+0

Teşekkürler Jeff. Bu yardımcı oldu. Diğer Q'yu kurtaracağım. – Prashant