Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mockito无法模拟目标类中存在的函数调用';s构造函数_Java_Unit Testing_Mockito - Fatal编程技术网

Java Mockito无法模拟目标类中存在的函数调用';s构造函数

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

我尝试使用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);
}
}
因此,我使用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扩展了{
`