Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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
Unit testing 在JUnit中模拟方法内的对象_Unit Testing_Junit_Mocking_Mockito - Fatal编程技术网

Unit testing 在JUnit中模拟方法内的对象

Unit testing 在JUnit中模拟方法内的对象,unit-testing,junit,mocking,mockito,Unit Testing,Junit,Mocking,Mockito,我正在努力与JUnit和Mockito等公司打交道 我目前有一个方法,如下所示 ObjectMetadata metadata = getMetadata(path.toString()); 我有什么办法可以嘲笑它吗?我试过下面的方法 Whitebox.setInternalState(<mock of class>, "metadata", "abc"); Whitebox.setInternalState(,“元数据”,“abc”); 但我只是 org.powermock.

我正在努力与JUnit和Mockito等公司打交道

我目前有一个方法,如下所示

ObjectMetadata metadata = getMetadata(path.toString());
我有什么办法可以嘲笑它吗?我试过下面的方法

Whitebox.setInternalState(<mock of class>, "metadata", "abc");
Whitebox.setInternalState(,“元数据”,“abc”);
但我只是

org.powermock.reflect.exceptions.FieldNotFoundException:在com.amazonaws.services.s3.model.ObjectMetadata的类层次结构中找不到名为“metadata”的实例字段

我认为这是因为以前使用Whitebox.setInternalState时使用了变量


任何信息。如果该方法受到保护,那么您就不需要使用Powermockito,简单的香草Mockito就足够了,而间谍就可以做到这一点。假设测试类与生产类位于同一个包中,就在
src/test/java
dir中

@PrepareForTest(ObjectMetadata.class)
public class PowerMockDemoTest {

    private ObjectMetadata objectMetadata;

    @Before
    public void setUp() {
        objectMetadata = new ObjectMetadata();
    }

    @Test
    public void testMockNew() throws Exception {
        ObjectMetadata mockObjectMetadata = mock(ObjectMetadata.class);

        PowerMockito.whenNew(ObjectMetadata.class)
            .withAnyArguments().thenReturn(mockObjectMetadata);

        ObjectMetadata actualObjectmetadata = getMetadata(path.toString());

        assertThat(actualObjectmetadata, is(mockObjectMetadata));
    }
}
ClassUnderTest classUnderTestSpy = Mockito.spy(new ClassUnderTest()); // spy the object 

ObjectMetadata objectMetadataToReturn = new ObjectMetadata();

doReturn(objectMetadataToReturn).when(classUnderTestSpy).get(Mockito.any(String.class));
我使用了
any()
matcher作为输入,但您也可以使用具体的值

更新如果看不到该方法,则需要创建一个扩展prod one的内部类,实现get方法:

public class Test{

  ObjectMetadata objectMetadataToReturn = new ObjectMetadata();

  @Test
  public void test(){
      ClassUnderTestCustom classUnderTestCustom  = new ClassUnderTestCustom();

      // perform tests on classUnderTestCustom  
  }

  private class ClassUnderTestCustom extends ClassUnderTest{

     @Override
     public String getMetadata(String path){
        return objectMetadataToReturn ;
     }
  }

}

谢谢桑维特。getMetadata()受保护的事实会改变什么吗?我收到一个错误,提示“无法查看受保护的方法”。如果方法getMetadata()是受保护的方法,那么我们需要在junit中使用反射API来调用该方法,如下面的示例所示:Class clazz=mockObjectMetadata.getClass();方法Method=clazz.getDeclaredMethod(“getMetadata”,String.class);方法setAccessible(true);mockObjectMetadata=(ObjectMetadata)方法;如果测试在不同的包中,是否没有办法让它工作?我的测试在com.in.stock.sf.col.tests中,而生产在com.in.stock.sf.col中。您为什么不使用src/main/java进行prod和/src/test/java进行测试?然后在每一个中都使用相同的包结构?对不起,我应该说清楚的。com.in.stock.sf.col位于src/main/java中,com.in.stock.sf.col.tests位于/src/test/java中。至于为什么子级别不同,我不确定,因为它是由其他人设置的。理论上,您的测试可以扩展prod类,并且您可以访问该方法。不过,正确的结构仍然是最好的方式。基本上,如果你想继续使用该结构,请检查我的更新