Java Mockito无法模拟目标类中存在的函数调用';s构造函数
我尝试使用Mockito和JUnit测试以下类:Java Mockito无法模拟目标类中存在的函数调用';s构造函数,java,unit-testing,mockito,Java,Unit Testing,Mockito,我尝试使用Mockito和JUnit测试以下类: public class A { private SomeClass someObject; private SomeImpClass someImpObject1; private SomeImpClass2 someImpObject2; public A(SomeImpClass someImpObject1, SomeImpClass2 someImpObject2){ someObject = m
public class A {
private SomeClass someObject;
private SomeImpClass someImpObject1;
private SomeImpClass2 someImpObject2;
public A(SomeImpClass someImpObject1, SomeImpClass2 someImpObject2){
someObject = makeNewObject(someImpObject1, someImpObject2);
}
public makeNewObject(SomeImpClass1 someImpObject1, SomeImpClass2 someImpObject2){
return new SomeObject(someImpObject1,someImpObject2);
}
public usingSomeObject(){
someObject.doSomething();
}
}
@RunWith(MockitoJUnitRunner.class)
public class ATest {
@Mock
SomeImpClass1 someImpObject1;
@Mock
SomeImpClass2 someImpObject2;
@Mock
SomeObject someObject;
@Spy
A a;
@Before
public void setUp() {
when(A.makeNewObject).thenReturn(someObject);
this.A = new A(this.someImpObject1, someImpObject2);
when(someObject.doSomething).thenReturn(something);
}
}
因此,我使用Mockito和JUnit编写了一个单元测试:
public class A {
private SomeClass someObject;
private SomeImpClass someImpObject1;
private SomeImpClass2 someImpObject2;
public A(SomeImpClass someImpObject1, SomeImpClass2 someImpObject2){
someObject = makeNewObject(someImpObject1, someImpObject2);
}
public makeNewObject(SomeImpClass1 someImpObject1, SomeImpClass2 someImpObject2){
return new SomeObject(someImpObject1,someImpObject2);
}
public usingSomeObject(){
someObject.doSomething();
}
}
@RunWith(MockitoJUnitRunner.class)
public class ATest {
@Mock
SomeImpClass1 someImpObject1;
@Mock
SomeImpClass2 someImpObject2;
@Mock
SomeObject someObject;
@Spy
A a;
@Before
public void setUp() {
when(A.makeNewObject).thenReturn(someObject);
this.A = new A(this.someImpObject1, someImpObject2);
when(someObject.doSomething).thenReturn(something);
}
}
我在这里面临的问题是,尽管我已将函数makeNewObject存根为返回某个类的模拟对象,但代码流仍在函数(makeNewObject)中运行,并给出一个null异常
我做错了什么?
我为此浪费了一天时间
莫基托说得不太流利 你将无法通过监视和存根实现你的目标。 这是因为您的目标是存根构造函数中使用的方法。。但是一旦你创建了一个具体的对象并监视它,你就不能开始存根。。做不到 我建议在测试类内创建一个私有类,该类扩展被测试的类,重写构造函数中调用的方法,然后在测试中使用它:
@RunWith(MockitoJUnitRunner.class)
public class ATest {
@Mock
SomeObject someObjectMock;
A a;
@Before
public void setUp() {
this.a = new MyTest();
}
private class MyTest extends ATest{
@Override
public makeNewObject(SomeImpClass1 someImpObject1, SomeImpClass2 someImpObject2){
return someObjectMock;
}
}
现在您不需要使用监视和存根,因为重写的方法总是返回您在测试中期望的内容。这是什么`when(A.makeNewObject)。thenReturn(someObject);`A是类,makeNewObject不是变量。把合适的代码放在这里,你的测试类甚至没有编译。也许您可以显示您遇到问题的实际代码?可能是在删除
a.makeNewObject()
后重新分配a
,因此a
指的是未删除的内容。在测试中删除一个对象,然后使用一个完全不同的对象是没有用的。请提供实际演示问题的代码。我试图用对象A
替换A
,但这带来了一个mockiToException:无法为“A”字段实例化@Spy(没有默认构造函数)。这不是实际的代码,更多的是一种表示,我很抱歉@pvpkiran,它是一个.makeNewObject()为我工作。谢谢。:)没问题。很高兴did@MaciejKowalski是否应该是私有类MyTest扩展了{
`