当我的集成测试在 Jenkins 中运行时,它发生了一些奇怪的事情,它无法连接模拟的初级 bean。
但是,当使用 Maven 安装在本地运行时,它可以完美运行。这是我的集成测试:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {App.class, SampleIT.class})
@WebIntegrationTest({"server.port:0"})
public class SampleIT {
@Primary
@Bean
public SampleRepository sampleRepository() { //this is wired fine in my local Maven, but not in Jenkins...
return Mockito.mock(Sample.class);
}
@Test
public void testSomething {
//when this is executed, the mock has been wired at this point in my local Maven
//however in Jenkins, it still uses the real SampleRepositoryImpl, not the mock
}
}
这是应用程序.class,这是一个 Spring 启动应用程序:
@SpringBootApplication
@EnableAspectJAutoProxy
@EnableDiscoveryClient
@ComponentScan("com.sample")
@EnableJpaRepositories("com.sample")
@EntityScan("com.sample")
@DependsOn("OAuth2Config")
public class App extends SpringBootServletInitializer {
public static void main(final String[] args) {
SpringApplication.run(App.class, args);
}
}
我当然可以看到 Jenkins 使用的是真正的 SampleRepositoryImpl 而不是模拟,因为 Jenkins 控制台中生成的 sql 语句。与我的本地 Maven 不同,没有生成 sqls,因为它使用的是模拟。
还有其他人经历过吗?
如何解决这个问题,让在 Jenkins 中运行也会使用 mock,它被标记为主 bean?
---------更新---------
如果我:
- 从@SpringApplicationConfiguration中删除 SampleIT.class
- 并将@Configuration添加到 SampleIT
它有效,模拟是有线的。但是,这变成了一个全局配置,我的其他集成测试开始拾取此类中定义的模拟。所以这不是一个真正的解决方案,任何想法为什么@SpringApplicationConfiguration似乎不起作用?
你在本地执行Junit的方式是什么? 您可以尝试以Maven测试的形式执行并共享结果。 使用@MockBean而不是@Bean和@Primary。