我试图掌握JUnit& amp; Mockito等。
我目前有一个方法,下面一行。
ObjectMetadata metadata = getMetadata(path.toString());
有什么方法可以嘲笑它吗?我尝试过以下的内容
Whitebox.setInternalState(<mock of class>, "metadata", "abc");
但我得到了
org.powermock.reflect.exceptions.FieldNotFoundException:没有名为&#34的实例字段;元数据&#34;可以在com.amazonaws.services.s3.model.ObjectMetadata的类层次结构中找到。
我认为这是因为之前使用的Whitebox.setInternalState是变量。
任何信息。可能会让我开始的,我将不胜感激。
答案 0 :(得分:0)
@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));
}
}
答案 1 :(得分:0)
如果该方法受到保护,那么你不需要使用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 ;
}
}
}