我正在尝试掌握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));
}
}