Java 模拟方法中的自动连线字段
我想知道是否有办法模拟正在自动连线的场 考虑以下情况 我有一个类名aJava 模拟方法中的自动连线字段,java,junit,mockito,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 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.
}
}
但我的问题是->在用新的方法创建对象之后,有没有办法在方法内部模拟自动连接字段
乙二醇
请提出建议,否则没有办法这么做
我不想改变自己的习惯。我也不想添加getter和setter或reflection。我只是想知道,在创建类的新对象之后,是否有办法模拟B实例 怎么样
它仍然是基于反射的,并且有所有相关的缺点,尽管它非常简单且易于阅读 使用mockito无法做到这一点,这需要修改被测试类的字节码。然而,Powermock允许这样的存根。但是请注意,我和Powermock的创建者Johan Haleby将推动重构,而不是使用Powermock。Powermock功能非常强大,可能太多了,而且工作允许任何人编写遗留代码,这将是很难维护或扩展的,您可以在设计糟糕的遗留代码中找到
在你的情况下,我不知道你的依赖注入有什么问题。但是,如果代码需要一个新的B实例,那么在一个工厂/提供者/构建器类中插入一个将生成一个新的B实例可能会很有用。这样的代码可以很容易地用Mockito存根。您愿意使用反射吗?另一种方法是使其受到保护,让您的测试类扩展并直接设置它。不,我想在不进行反射或更改修饰符的情况下进行设置。在不进行反射的情况下,无法访问私有字段。如果有办法的话,private就不再是private了。
public class TestA {
public void testAMethod() {
A a =new A();
// how to mock the B instance in it.
}
}
A a = new A();
B b = mock(B.class);
ReflectionTestUtils.setField(a, "b", b);