スプリングブーツを使用しています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() {
}
}
TestRestTemplate
は、@SpringBootTest
はwebEnvironment
で構成されています。これは、Webコンテナーを開始し、HTTP要求をリッスンすることを意味します。例えば:
@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
SpringBootTest注釈のJava doc)を読むと、注釈は以下の機能を提供すると言います(すべてをここにリストするのではなく、質問に関連するものだけをリストします)。
したがって、@ 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
}
それを使用するには、非推奨のTestRestTemplateを使用しないでください。
非推奨:
import org.springframework.boot.test.TestRestTemplate;
正しい:
import org.springframework.boot.test.web.client.TestRestTemplate;
次に、@Autowired
クラスの注釈:
@Autowired
private TestRestTemplate restTemplate;
使用しないでください:
@Autowired
private MockMvc mvc;
両方が一緒に機能しません。
Spring boot documentation によると:
MockMvc
を非@WebMvcTest
(例:SpringBootTest
)に注釈を付ける@AutoConfigureMockMvc
。