如何使用JUNIT超越或跳过方法?

时间:2017-09-06 00:29:34

标签: java junit powermock easymock powermockito

我有一段我需要测试的代码。让我们说

Class MainClass{    
   public void startProcess() {     
      ----Some Logic to generate fileName; 
          uploadFile(fileName);     
       }

  private static void uploadFile(String key) {    
      fileUpload();    
      deleteFile();    
  }    
}

我想编写一个JUNIT测试,它将调用startProcess,但要么跳过uploadFile行,要么忽略uploadFile方法中存在的任何行。

我尝试使用powerMock但它不起作用。以下是我的代码

@RunWith(PowerMockRunner.class)
@PrepareForTest(MainClass.class)
public class MainClassTest {         
   @Test
   public void teststartProcess() throws Exception {
     processor=PowerMock.createPartialMock(MainClass.class,"uploadFile");
     PowerMock.expectPrivate(processor , "uploadFile", "xyz").andAnswer(
       new IAnswer<Void>() {
       @Override
       public Void answer() throws Throwable {
         System.out.println("Invoked!");
         return null;
       }
    }).atLeastOnce();
  }
}

但它确实覆盖了uploadFile方法只是打印调用。它调用fileUpload和deleteFile,而不是仅仅跳过行和打印调用。

我的基本目标是模拟方法uploadFile只打印

private void uploadFile(String key) {
  System.out.println("Invoked");
}

我知道可以使用Mockito,但我们可以使用PowerMock或EasyMock。

2 个答案:

答案 0 :(得分:3)

您应该考虑重构代码以使其可测试,而不是试图通过复杂的测试。根据您提供的内容,我将文件功能移至另一个类。 像这样的东西:

public class MainClass {
    private final FileUploader fileUploader;

    public MainClass(FileUploader fileUploader) {
        this.fileUploader= fileUploader;
    }

    public void startProcess() {
        fileUploader.uploadFile(fileName);
    }
}

通过这种重构,您可以使用普通模拟进行测试:

String fileName = "foo";
FileUploader fileUploader = mock(FileUploader.class);

MainClass classUnderTest = new MainClass(fileUploader);
classUnderTest.startProcess();

verify(fileUploader, times(1)).uploadFile(fileName);

另一个好处是测试fileUploader也很容易。如你所见,我也摆脱了所有复杂的部分模拟和私人测试。

答案 1 :(得分:1)

在调用测试方法之前,您必须将模拟对象更改为重放模式,并且必须告诉Powermock使用静态方法:

mockStaticStrict(MainClass.class,method(MainClass.class, "uploadFile"));

PowerMock.replay(processor);
processor.startProcess();

有关详细信息,请参阅Mocking private methods

强烈建议重构此代码并使其可测试。