我想知道是否有办法模拟正在自动装配的领域。
考虑以下情况。
我有一个班级名称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实例。
答案 0 :(得分:0)
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签在一起。