2017-01-11 10 views
0

最後のクラスと@PostConstruct annotaionを使ってmockito apiを使ってjunitを書こうとしています。以下は私がこれまでに書いたサンプルコードです。私はこれを実行すると、私はこれまで最後のクラスのjunitを@postconstructを使ってmockitoを使って書く

@RunWith(SpringRunner.class) 
@SpringBootTest(classes = {ConfigCache.class}) 
public class ConfigCacheTest { 

    @InjectMocks 
    private ConfigCache configCache; 

    @MockBean 
    private ConfigDao dao; 

    private Map<String,Collection<Configuration>> map; 

    @Before 
    public void setUp() { 

     MockitoAnnotations.initMocks(this); 

    } 

    @After 
    public void tearDown() { 


    } 

    @Test 
    public void testInit() throws DaoException { 

     map = new HashMap<String,Collection<Configuration>>(); 
     List<Configuration> configurations = new ArrayList<Configuration>(); 

     Configuration configuration = new Configuration(); 
     configuration.setAttributeName("a"); 
     configuration.setAttributeValue("20"); 

     configurations.add(configuration); 
     configuration = new Configuration(); 
     configuration.setAttributeName("b"); 
     configuration.setAttributeValue("10"); 

     configurations.add(configuration); 

     map.put("abc", configurations); 
     when(dao.loadConfigurations()).thenReturn(map); 
     assertEquals("ConfigurationCacheBuilder.init()",configurationCacheBuilder.getConfigurationcache().size(),1); 

    } 

} 

でいる

public final class ConfigCache { 

private static final MultiKeyMap configCache = new MultiKeyMap(); 

@Autowired 
    private ConfigDao dao; 

    @PostConstruct 
    public void init() { 

     Map<String, Collection<Configuration>> map = null; 
     try { 
      if (configurationCache != null || configurationCache.isEmpty()) { 

       map = dao.loadConfigurations(); 
       map.forEach((k, v) -> { 
        v.forEach((c) -> { 
         configCache.put(k, c.getAttributeName(), c.getAttributeValue()); 
        }); 
       }); 
      } 

     } catch (DaoException e) { 
      throw new RuntimeException(e); 
     } 
    } 

    public Object getValue(String k1, String k2) { 
     return configurationCache.get(k1, k2); 
    } 

    @PreDestroy 
    public void clearCache() { 
     if (configCache != null) { 
      configCache.clear(); 
     } 
    } 

} 

JUnitは、私はmockitoの2つのバージョンで試してみました

java.lang.ExceptionInInitializerError 
    at org.mockito.internal.exceptions.stacktrace.ConditionalStackTraceFilter.<init>(ConditionalStackTraceFilter.java:17) 
    at org.mockito.exceptions.base.MockitoException.filterStackTrace(MockitoException.java:41) 
    at org.mockito.exceptions.base.MockitoException.<init>(MockitoException.java:30) 
    at org.mockito.exceptions.misusing.MockitoConfigurationException.<init>(MockitoConfigurationException.java:18) 
    at org.mockito.internal.configuration.plugins.PluginLoader.loadImpl(PluginLoader.java:66) 
    at org.mockito.internal.configuration.plugins.PluginLoader.loadPlugin(PluginLoader.java:24) 
    at org.mockito.internal.configuration.plugins.PluginRegistry.<init>(PluginRegistry.java:12) 
    at org.mockito.internal.configuration.plugins.Plugins.<clinit>(Plugins.java:11) 
    at org.mockito.internal.util.MockUtil.<clinit>(MockUtil.java:24) 
    at org.springframework.boot.test.mock.mockito.MockReset.<clinit>(MockReset.java:56) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at java.lang.Class.getEnumConstantsShared(Class.java:3320) 
    at java.lang.Class.enumConstantDirectory(Class.java:3341) 
    at java.lang.Enum.valueOf(Enum.java:232) 
    at sun.reflect.annotation.AnnotationParser.parseEnumValue(AnnotationParser.java:483) 
    at sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:347) 
    at java.lang.reflect.Method.getDefaultValue(Method.java:606) 
    at sun.reflect.annotation.AnnotationType.<init>(AnnotationType.java:128) 
    at sun.reflect.annotation.AnnotationType.getInstance(AnnotationType.java:85) 
    at sun.reflect.annotation.AnnotationParser.parseAnnotation2(AnnotationParser.java:266) 
    at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:120) 
    at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:72) 
    at java.lang.reflect.Field.declaredAnnotations(Field.java:1150) 
    at java.lang.reflect.Field.declaredAnnotations(Field.java:1148) 
    at java.lang.reflect.Field.getDeclaredAnnotations(Field.java:1139) 
    at java.lang.reflect.AccessibleObject.getAnnotations(AccessibleObject.java:207) 
    at org.junit.runners.model.FrameworkField.getAnnotations(FrameworkField.java:31) 
    at org.junit.runners.model.TestClass.addToAnnotationLists(TestClass.java:84) 
    at org.junit.runners.model.TestClass.scanAnnotatedMembers(TestClass.java:71) 
    at org.junit.runners.model.TestClass.<init>(TestClass.java:57) 
    at org.junit.runners.ParentRunner.createTestClass(ParentRunner.java:88) 
    at org.junit.runners.ParentRunner.<init>(ParentRunner.java:83) 
    at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:65) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:138) 
    at org.springframework.test.context.junit4.SpringRunner.<init>(SpringRunner.java:49) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
    at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104) 
    at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86) 
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) 
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26) 
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) 
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createUnfilteredTest(JUnit4TestLoader.java:84) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:70) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:43) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:444) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
Caused by: java.lang.NullPointerException 
    at org.mockito.internal.configuration.plugins.Plugins.getStackTraceCleanerProvider(Plugins.java:17) 
    at org.mockito.internal.exceptions.stacktrace.StackTraceFilter.<clinit>(StackTraceFilter.java:21) 
    ... 55 more 

エラーを取得

<dependency> 
       <groupId>org.mockito</groupId> 
       <artifactId>mockito-all</artifactId> 
       <version>2.0.2-beta</version> 
      </dependency> 
and 

      <dependency> 
    <groupId>org.mockito</groupId> 
    <artifactId>mockito-core</artifactId> 
    <version>2.5.5</version> 

誰かが私に何が起こっているのか教えてもらえますか?違う ?

+0

http://stackoverflow.com/questions/15638425/mockito-throws-nullpointer-when-creating-a-mock-object – alayor

+0

私はここではpowermockを使用していないし、問題が解決されていない場合は、そこのユーザーに別のエラーが表示されます。 – user641887

+0

問題は 'ConfigDao dao'が' dao'の前に 'init'メソッドで使われていて、mockitoによって注入されているということです。 – alayor

答えて

0

これを解決する方法の1つは、dao変数のパッケージレベル設定ツールを作成することです。

void setConfigDao(ConfigDao configDao) { 
    dao = configDao; 
} 

そして、クラスConfigCacheTest@InjectMocksを使用してsetUp()方法であなたのconfigCacheオブジェクトを初期化することは避けてください。

@Before 
public void setUp() { 
    MockitoAnnotations.initMocks(this); 
    configCache = new ConfigCache(); 
    configCache.setConfigDao(dao); 
    configCache.init(); 
} 

この方法で、あなたはmockitoがdaoオブジェクトを注入する前に@PostConstruct init()メソッドが呼び出されたときに、このNPEを回避することができます。

関連する問題