使用@SpringApplicationConfiguration进行集成测试,模拟无法在Jenkins中运行

时间:2017-04-12 03:50:11

标签: jenkins spring-boot junit mockito integration-testing

当我在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
    }
}

这是App.class,它是一个Spring Boot应用程序:

@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而不是mock,因为Jenkins控制台中生成了sql语句。与我的本地Maven不同,因为它使用了mock,所以没有生成sqls。

有没有其他人经历过这个?

如何解决这个问题,以便在Jenkins中运行也会使用mock,它被标记为主bean?

---------更新---------

如果我:

  1. 从@SpringApplicationConfiguration
  2. 中删除SampleIT.class
  3. 并将@Configuration添加到SampleIT
  4. 它有效,模拟是有线的。但是,这成为一个全局配置,我的其他集成测试开始拾取此类中定义的模拟。所以它不是一个真正的解决方案,为什么@SpringApplicationConfiguration看起来不起作用?

1 个答案:

答案 0 :(得分:0)

您在本地执行Junit的方式是什么? 您可以尝试执行Maven测试并分享结果。 使用@MockBean而不是@Bean和@Primary。