web-dev-qa-db-ja.com

TestRestTemplateおよびMockMvcを注入できないスプリングブートテスト

スプリングブーツを使用しています1.4.0.RELEASE。コントローラークラスのテストを書いています。次の例外が発生します。

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.concur.cognos.authentication.service.ServiceControllerITTest': Unsatisfied dependency expressed through field 'restTemplate': No qualifying bean of type [org.springframework.boot.test.web.client.TestRestTemplate] found for dependency [org.springframework.boot.test.web.client.TestRestTemplate]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.boot.test.web.client.TestRestTemplate] found for dependency [org.springframework.boot.test.web.client.TestRestTemplate]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

これが私のテストクラスです

public class ServiceControllerITTest extends ApplicationTests {

    @Autowired
    private TestRestTemplate restTemplate;

    @Autowired
    private MockMvc mvc;

    @Test
    public void exampleTest() throws Exception {
         // test
    }
}

ApplicationTests.Java

@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
//@DirtiesContext
public class ApplicationTests {

    @Autowired
    Environment env;

    @Test
    public void contextLoads() {

    }

}
37
brain storm

TestRestTemplateは、@SpringBootTestwebEnvironmentで構成されています。これは、Webコンテナーを開始し、HTTP要求をリッスンすることを意味します。例えば:

@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
71
Andy Wilkinson

SpringBootTest注釈のJava doc)を読むと、注釈は以下の機能を提供すると言います(すべてをここにリストするのではなく、質問に関連するものだけをリストします)。

  • 定義済みまたはランダムなポートでリッスンしている完全に実行されているWebサーバーを起動する機能など、さまざまなwebEnvironmentモードのサポートを提供します。
  • 定義済みまたはランダムなポートでリッスンしている完全に実行されているWebサーバーを使用しているWebテストで使用するために、TestRestTemplateまたはWebTestClient Beanを登録します。

したがって、@ SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)は、TestRestTemplateを自動接続する機能を提供します。これは、完全に実行されているWebサーバーを起動するためです(@AndyWilkinsonの回答にも記載されています)。

ただし、同じTestClassでMockMvcも自動配線する場合は、TestClassで@AutoConfigureMockMvcアノテーションを使用します。

Testクラスは次のようになります。

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class SBTest {
    @Autowired
    private TestRestTemplate restTemplate;

    @Autowired
    private MockMvc mvc;

   // tests
}
6
avinesh

それを使用するには、非推奨のTestRestTemplateを使用しないでください。

非推奨:

import org.springframework.boot.test.TestRestTemplate;

正しい:

import org.springframework.boot.test.web.client.TestRestTemplate;

次に、@Autowiredクラスの注釈:

@Autowired
private TestRestTemplate restTemplate;

使用しないでください:

@Autowired
private MockMvc mvc;

両方が一緒に機能しません。

5
Jesus Macias

Spring boot documentation によると:

MockMvcを非@WebMvcTest(例:SpringBootTest)に注釈を付ける@AutoConfigureMockMvc

2
Aphax