【问题标题】:Mocking autowired field in the method在方法中模拟自动装配字段
【发布时间】:2014-10-20 09:39:26
【问题描述】:

我想知道是否有办法模拟正在自动装配的字段。

考虑以下情况。

我有一个班级名称 A

public class A {
    @Autowired
    private B b;

    public void aMethod() {
         b.method();
    }
}

另一个B类是这样的

public class B {

    public void method() {
    // some code
    }
}

现在我想为该方法编写junit。

我知道有一种方法可以像这样模拟自动装配的字段。

public class TestA {

   @InjectMock
   private A a;

   @Mock
   private B b;


    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
    }

    public void testAMethod() {
        // write test case.
    }

}

但我的问题是 -> 有没有办法在使用 new 创建对象后模拟方法内部的自动装配字段。

例如

public class TestA {


    public void testAMethod() {
       A a =new A();

       // how to mock the B instance in it.

    }

}

请建议或没有办法这样做????

我不想改变私有修饰符。我也不想添加 getter 和 setter 或反射。我只想知道在创建 A 类的新对象后是否有办法模拟 B 实例。

【问题讨论】:

  • 您愿意使用反射吗?其他方法是使其受到保护,让您的测试类扩展 A 并直接设置它。
  • 不,我想在没有反射或更改修饰符的情况下这样做。
  • 没有反射就无法访问私有字段。如果有办法,私有将不再意味着私有。

标签: java junit mockito


【解决方案1】:

ReflectionTestUtils怎么样?

A a = new A();
B b = mock(B.class);
ReflectionTestUtils.setField(a, "b", b);

它仍然是基于反射的,并且具有所有相关的缺点,尽管它非常简单且易于阅读。

【讨论】:

    【解决方案2】:

    你不能用 mockito 做到这一点,这需要修改被测试类的字节码。然而 Powermock 允许这样的存根。请注意,尽管我和 Powermock 的创建者 - Johan Haleby - 会推动重构而不是使用 Powermock。 Powermock 非常强大,可能功能太多了,而且工作允许任何人编写遗留代码,这些代码难以维护或扩展(您可以在设计不佳的遗留代码中找到这种特性)。

    在你的情况下,我不知道你的依赖注入有什么问题。但是,如果代码需要B 的新实例,则在A 中注入一个工厂/提供者/构建器类可能会很有用,它将生成B 的新实例。这样的代码可以很容易地用 Mockito 存根。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      • 1970-01-01
      • 2014-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多