我如何超越或跳过使用 JUNIT 的方法?
How can I surpass or skip a method using JUNIT?
我有一段代码需要测试。假设
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 以仅打印 invoked 。它调用 fileUpload 和 deleteFile 而不是仅仅跳过行并打印调用 .
我的基本目标是模拟 uploadFile 方法只打印
private void uploadFile(String key) {
System.out.println("Invoked");
}
我知道可以使用 Mockito,但我们可以使用 PowerMock 或 EasyMock。
与其尝试进行过于复杂的测试,不如考虑重构代码以使其可测试。根据您提供的内容,我会将文件功能移至另一个 class。
像这样:
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 也变得容易。如您所见,我还摆脱了所有复杂的部分模拟和私人测试。
您必须在调用被测方法之前将模拟对象更改为重播模式,并且您必须告诉 Powermock 在静态方法上工作:
mockStaticStrict(MainClass.class,method(MainClass.class, "uploadFile"));
PowerMock.replay(processor);
processor.startProcess();
有关这方面的更多信息,请参阅 Mocking private methods。
我强烈建议重构此代码并使其可测试。
我有一段代码需要测试。假设
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 以仅打印 invoked 。它调用 fileUpload 和 deleteFile 而不是仅仅跳过行并打印调用 .
我的基本目标是模拟 uploadFile 方法只打印
private void uploadFile(String key) {
System.out.println("Invoked");
}
我知道可以使用 Mockito,但我们可以使用 PowerMock 或 EasyMock。
与其尝试进行过于复杂的测试,不如考虑重构代码以使其可测试。根据您提供的内容,我会将文件功能移至另一个 class。 像这样:
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 也变得容易。如您所见,我还摆脱了所有复杂的部分模拟和私人测试。
您必须在调用被测方法之前将模拟对象更改为重播模式,并且您必须告诉 Powermock 在静态方法上工作:
mockStaticStrict(MainClass.class,method(MainClass.class, "uploadFile"));
PowerMock.replay(processor);
processor.startProcess();
有关这方面的更多信息,请参阅 Mocking private methods。
我强烈建议重构此代码并使其可测试。