我想知道是否有一种方法可以模拟正在自动连接的字段。
考虑以下情况。
我有一个类名
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 a = new A();
B b = mock(B.class);
ReflectionTestUtils.setField(a, "b", b);
它仍然是基于反思的,并且有所有相关的缺点,尽管它非常简单易读。
使用mockito不能做到这一点,这需要修改正在测试的类的字节码。但是Powermock允许这样的存根。请注意,我和Powermock的创建者Johan Haleby会推动重构,而不是使用Powermock。Powermock非常强大,可能太强大了,工作允许任何人编写难以维护或扩展的遗留代码(您可以在设计糟糕的遗留代码中找到属性)。
在您的情况下,我不知道您的依赖项注入出了什么问题。但是,如果代码需要B
的新实例,那么在A
中注入一个工厂/提供者/构建器类可能会很有用,该类将生成B
的新实例。使用Mockito可以很容易地清除此类代码。