java - 如何使用 JUNIT 超越或跳过某个方法?

标签 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 而不是仅仅跳过行并 print invoke 。

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

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

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

最佳答案

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

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 也变得很容易。正如您所看到的,我还摆脱了所有复杂的部分模拟和私有(private)测试。

关于java - 如何使用 JUNIT 超越或跳过某个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46065080/

相关文章:

unit-testing - Spring Boot 在集成测试中使用 PowerMock 模拟静态方法

android - PowerMock `thenReturn` 不返回模拟静态方法的预期数据?

java - 创建 Spring bean 的最佳方式

java - 使用java反射提取注释值?

java - 如何将 Eclipse Java SE 应用程序转换为 J2E 应用程序?

java - 如何在java swing GUI中显示计算机文件和文件夹

android - 运行用于自动化构建的JUNIT测试-如何?

java - 单元测试 MessageListener 类

java - 在 Ant 构建中运行 jacoco 时如何查找 junit 类中的错误

java - mocks - 如何验证调用了私有(private)方法