【问题标题】:Mock a class instance common in many classes in spring模拟spring中很多类中常见的一个类实例
【发布时间】:2016-11-03 08:59:13
【问题描述】:

我是弹簧概念的新手。我正在尝试为该类的一种方法编写一个 Junit。我想从多个位置模拟用作@Autowired 的spring 框架JdbcTemplate 类。但我不想在每个班级都使用@Mock。有什么方法可以模拟这个类,并且可以通过使用@Autowired 从多个位置使用。

提前致谢。

【问题讨论】:

    标签: java spring unit-testing junit


    【解决方案1】:

    为您的测试定义一个特定的弹簧配置文件(例如“test”),在该配置文件中创建带有模拟库和注释@Profile("test")JdbcTemplate bean。这样,只有在“测试”配置文件处于活动状态时才会创建此模拟。

    将注释@Profile("!test") 添加到真正的JdbcTemplate bean 中,这样它就不会在测试配置文件中创建。

    然后在你的测试类上面添加@ActiveProfiles("test")注解。

    【讨论】:

      【解决方案2】:

      有点无法回答,但我不建议在单元测试时使用 Springinject dependencies。如果您使用constructor injection,那么您可以简单地从单元测试中调用构造函数并手动传递您的模拟或测试替身。这使得从单元测试中非常清楚和明确地提供了用于测试目的的依赖项。如果你使用的是 setter 注入,你也可以这样做。不要通过Spring 实现被测类,只需从你的junit 测试类构造被测类,并强制提供你想要的对该类的依赖项。

      【讨论】:

      • 嗨,吉姆,感谢您的回复!!!!包含该方法的类有多个 Autowired bean,我只想模拟 JdbcTemplate bean。但是当我在我的测试类中使用@Mock jdbcTemplte 时,在为原始类创建bean 时,我收到jdbcTemplate 的错误nosucbeanfound 错误。你能帮忙吗?
      • 你是如何从 Spring 获得被测类的?听起来您的自动装配注释没有找到要在类路径中注入的类。我需要看更多的代码。 @Mock 是一个 mockito 注释,所以听起来你正在尝试使用该框架来创建你的 mock。
      • 这是我的测试 class.public class test{ @@Mock JdbcTemplate a; @@Autowired ABC abc;@Before public void init(){MockitoAnnotations.initMocks(this);} @@Test public void test(){abc.somemethod()}}
      • 这是我正在为其编写测试的原始类。公共类 ABC{@Autowires JdbcTemplate a; public void somemethod(){//一些实现}}
      • 您应该在测试类中使用@InjectMocks ABC abc; 而不是@Autowired ABC abc;
      猜你喜欢
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      • 2016-03-19
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多