【发布时间】:2016-11-03 08:59:13
【问题描述】:
我是弹簧概念的新手。我正在尝试为该类的一种方法编写一个 Junit。我想从多个位置模拟用作@Autowired 的spring 框架JdbcTemplate 类。但我不想在每个班级都使用@Mock。有什么方法可以模拟这个类,并且可以通过使用@Autowired 从多个位置使用。
提前致谢。
【问题讨论】:
标签: java spring unit-testing junit
我是弹簧概念的新手。我正在尝试为该类的一种方法编写一个 Junit。我想从多个位置模拟用作@Autowired 的spring 框架JdbcTemplate 类。但我不想在每个班级都使用@Mock。有什么方法可以模拟这个类,并且可以通过使用@Autowired 从多个位置使用。
提前致谢。
【问题讨论】:
标签: java spring unit-testing junit
为您的测试定义一个特定的弹簧配置文件(例如“test”),在该配置文件中创建带有模拟库和注释@Profile("test") 的JdbcTemplate bean。这样,只有在“测试”配置文件处于活动状态时才会创建此模拟。
将注释@Profile("!test") 添加到真正的JdbcTemplate bean 中,这样它就不会在测试配置文件中创建。
然后在你的测试类上面添加@ActiveProfiles("test")注解。
【讨论】:
有点无法回答,但我不建议在单元测试时使用 Spring 到 inject dependencies。如果您使用constructor injection,那么您可以简单地从单元测试中调用构造函数并手动传递您的模拟或测试替身。这使得从单元测试中非常清楚和明确地提供了用于测试目的的依赖项。如果你使用的是 setter 注入,你也可以这样做。不要通过Spring 实现被测类,只需从你的junit 测试类构造被测类,并强制提供你想要的对该类的依赖项。
【讨论】:
@InjectMocks ABC abc; 而不是@Autowired ABC abc;。