Unit testing 在JUnit中模拟方法内的对象
我正在努力与JUnit和Mockito等公司打交道 我目前有一个方法,如下所示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.
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类,并且您可以访问该方法。不过,正确的结构仍然是最好的方式。基本上,如果你想继续使用该结构,请检查我的更新