在 JUnit 中模拟方法中的对象



我正在尝试掌握JUnit和Mockito等。

我目前有一个带有以下行的方法。

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

有什么办法可以嘲笑它吗?我已经尝试过以下方法。

Whitebox.setInternalState(<mock of class>, "metadata", "abc");

但我只是得到

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

我认为这是因为以前使用Whitebox.setInternalState是带有变量的。

任何可能让我开始的信息将不胜感激。

如果该方法受到保护,那么您不需要使用 Powermockito,普通的香草 Mockito 就足够了,间谍可以在这里解决问题。假设测试类与生产类位于同一包中,只是在src/test/java目录中。

ClassUnderTest classUnderTestSpy = Mockito.spy(new ClassUnderTest()); // spy the object 
ObjectMetadata objectMetadataToReturn = new ObjectMetadata();
doReturn(objectMetadataToReturn).when(classUnderTestSpy).get(Mockito.any(String.class));

我使用any()匹配器进行输入,但您也可以使用具体值。

更新 如果看不到该方法,则需要创建一个扩展 prod 的内部类,实现 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 ;
     }
  }
}
@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));
    }
}

相关内容

  • 没有找到相关文章

最新更新