我有一个疑问: 什么是正确的配置以仅加载我要在该集成测试中测试的Enpoint类,而不加载整个应用程序上下文(不是所有Enpoint类)? 现在我有:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {WebServiceConfigTest.class}, properties = {"application.address=http://hostname:port/context"})
public class MyEndpointTest {
@Autowired
private ApplicationContext applicationContext;
private MockWebServiceClient mockClient;
@Before
public void init() {
mockClient = MockWebServiceClient.createClient(applicationContext);
MockitoAnnotations.initMocks(this);
}
@Test
public void test1(){}
....
}
WebServiceConfigTest中的是:
@ComponentScan("mypackages.soap")
@ContextConfiguration(classes = SoapApplication.class)
@MockBean(classes = {MyService.class})
public class WebServiceConfigTest {
}
SoapApplication是:
@ComponentScan({"mypackages"})
@SpringBootApplication
public class SoapApplication extends SpringBootServletInitializer implements WebApplicationInitializer {
public static void main(String[] args) {
SpringApplication.run(SoapApplication.class, args);
}
}
原因是在Soap模块中,我具有Service模块的依赖关系,而Service模块也具有其他依赖关系,依此类推。 如果我加载整个ApplicaitonContext,则:
如果我第二次这样做,将会使Soap模块意识到它不应该知道的事情。 如果我第一次这样做,则必须模拟并在config测试文件中维护使用的服务的完整列表,该列表可能很长。
这里有什么建议吗?
答案 0 :(得分:1)
什么是正确的配置,使其仅加载要在该集成测试中测试的Endpoint类,而不加载整个Application上下文
您可以要求spring仅实例化特定的Controller
类,而不能通过使用@WebMvcTest(MyEndpoint.class)加载完整的应用程序上下文
@RunWith(SpringRunner.class)
@WebMvcTest(MyEndpoint.class)
public class MyEndpointTest {
@MockBean //mock all service beans that are injected into controller
private Service service;
@Autowired
private MockMvc mockMvc;
@Test
public void test1(){}
....
}
}
如果您使用嵌入式数据库(例如H2)或嵌入式队列进行测试,我还建议使用@SpringBootTest
进行端到端集成测试
答案 1 :(得分:0)
经过长时间的搜索和试验,我找到了解决方案。 正如您可以要求REST上的Spring在
中仅将1个Controller放到上下文中一样@WebMvcTest(MyController.class)
您可以用同样的香气
@SpringBootTest(classes = {MyEndpoint.class})
它将仅加载您想要的端点,您可以模拟在其中使用的服务,也可以一直进行到存储库,无论您的应用程序业务逻辑在其中做什么。