在方法中模拟自动装配的字段

时间:2014-10-20 09:39:27

标签: java junit mockito

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

考虑以下情况。

我有一个班级名称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实例。

2 个答案:

答案 0 :(得分:0)

ReflectionTestUtils怎么样?

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

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

答案 1 :(得分:0)

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

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