2017-08-23 11 views
1

私はこのチュートリアルで、次の春ブーツベースのスタンドアロン(非Web)アプリケーションを持っている: https://www.mkyong.com/spring-boot/spring-boot-jdbc-mysql-hikaricp-example/Springブートスタンドアロンアプリケーションの単体テストを行う方法は?

私が直接MySQLを使用していますようhikaricp部分をスキップします。 アプリケーションが...しかし、私はこのエラーを得続ける、JUnitのテスト作業をすることはできませんRESTfulなWebサービスを呼び出して、照会することができ、正常に動作します:

java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test 
    at org.springframework.util.Assert.state(Assert.java:70) 
    at org.springframework.boot.test.context.SpringBootTestContextBootstrapper.getOrFindConfigurationClasses(SpringBootTestContextBootstrapper.java:202) 
    at org.springframework.boot.test.context.SpringBootTestContextBootstrapper.processMergedContextConfiguration(SpringBootTestContextBootstrapper.java:137) 
    at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildMergedContextConfiguration(AbstractTestContextBootstrapper.java:409) 
    at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildDefaultMergedContextConfiguration(AbstractTestContextBootstrapper.java:323) 
    at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildMergedContextConfiguration(AbstractTestContextBootstrapper.java:277) 
    at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildTestContext(AbstractTestContextBootstrapper.java:112) 
    at org.springframework.boot.test.context.SpringBootTestContextBootstrapper.buildTestContext(SpringBootTestContextBootstrapper.java:82) 
    at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:120) 
    at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:105) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTestContextManager(SpringJUnit4ClassRunner.java:152) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:143) 
    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.junit.internal.requests.FilterRequest.getRunner(FilterRequest.java:36) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:275) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:173) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:149) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:128) 
    at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203) 
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155) 
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) 

関連JUnitテストコード:

`

@RunWith(SpringRunner.class) 
@RestClientTest(ArrivalRestClient.class) 
public class ArrivalRestClientTest { 
    private static final String MOCK_URL = "http://baseURI/arrival"; 
    @Autowired 
    private ArrivalRestClient clientUnderTest; 
    @Autowired 
    private ObjectMapper objectMapper; 
    @Autowired 
    private MockRestServiceServer mockServer; 
    @Autowired 
    private RestTemplate restTemplate; 
    @Before 
    public void setUp() throws Exception { 
      mockServer = MockRestServiceServer.createServer(restTemplate); 
      clientUnderTest = new ArrivalRestClient(MOCK_URL); 
      ReflectionTestUtils.setField(clientUnderTest, "restTemplate", restTemplate); 

    } 
    @Test 
    public void testGetArrivals() throws JsonProcessingException { 

     Arrival arrival = new Arrival("JohnTest1", "GLBProduct", 0L); 
     String arrivalString = objectMapper.writeValueAsString(arrival); 
     this.mockServer.expect(requestTo("/arrival?source=source1&entity=entity1&timestamp=1000")).andRespond(withSuccess(arrivalString, MediaType.APPLICATION_JSON)); 

     Arrivals actual = clientUnderTest.getArrivals("JohnTest1", "GLBProduct", 0); 

     System.out.println("getExpectedtime: " + actual.getNextRunTime()); 
     System.out.println("getPartitions: " + actual.getPartitions()); 

     assertEquals((long)2000, actual.getNextRunTime()); 
     assertEquals(new Long[]{ (long)2,(long)3}, actual.getPartitions()); 

    } 
}` 

空のユニットテストでも失敗します。それがSpring Bootスタンドアロンアプリケーション(非Web)であるという事実に関係していると考えてください。私はあなたの助けを借りて、それをオンラインにする方法のヒントを見つけることができません!私の知る限り@RestClientTest注釈が豆の限られた数を提供します知っているよう

@SpringBootApplication 
public class DepManagerMain implements CommandLineRunner { 

    final static Logger logger = Logger.getLogger(DepManagerMain.class); 

    @Autowired 
    DataSource dataSource; 

    public static void main(String[] args) throws Exception { 
     SpringApplication app = new SpringApplication(DepManagerMain.class); 
     app.run(args); 
    } 

    @Override 
    public void run(String... args) throws Exception { 
     logger.info("DependencyManager starting"); 
     logger.info("DATASOURCE = " + dataSource); 
     ... 
    } 
} 
+0

具体的に何が間違っているのかを明記してください。 '@SpringBootConfigurationを見つけることができない場合は、テストで@ContextConfigurationまたは@SpringBootTest(classes = ...)を使用する必要があります。 – Ben

+1

Testクラスはどのパッケージですか?パッケージは '@ SpringBootApplication'クラスですか? – larsgrefer

+0

@SpringBootApplicationはcom.foo.pack1にあり、テスト対象のクラスはcom.foo.pack2にあります。このレイアウトに関する要件はありますか? – rxu

答えて

0

編集---また、私のメインクラスのコードを追加します。

私はRestTemplateがこれらの豆の1つだと思うので、この時点でオートワイヤリングが失敗していると思いますので、これをメインの@SpringBootConfigurationからロードしようとしています。

@RestClientTest注釈ではRestTemplateBuilderが表示されますが、これをオートワイヤリングしてRestTemplateを作成することもできます。

+0

私は他のユニットテストを起動しようとしましたが、空の場合でもこの "java.lang.IllegalStateException:@SpringBootConfigurationを見つけることができません"というヒットです。 単体テストではなく、アプリケーションレベルの設定が間違っていると思います... – rxu

関連する問題