在JUnit

时间:2018-01-12 00:36:43

标签: unit-testing junit mocking mockito

我试图掌握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是变量。

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

2 个答案:

答案 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 ;
     }
  }

}