【发布时间】:2013-03-15 18:24:01
【问题描述】:
我有一个类 FileGenerator,我正在为 generateFile() 方法编写一个测试,该方法应该执行以下操作:
1) 它应该在BlockAbstractFactory 上调用静态方法getBlockImpl(FileTypeEnum)
2) 它应该从子类方法getBlocks() 填充变量blockList
3) 它应该从最终的辅助类 FileHelper 调用静态方法 createFile,并传递一个字符串参数
4) 它应该调用blockList中每个BlockController的run方法
到目前为止,我有这个空方法:
public class FileGenerator {
// private fields with Getters and Setters
public void generateBlocks() {
}
}
我正在使用 JUnit、Mockito 来模拟对象,并且我尝试使用 PowerMockito 来模拟静态类和最终类(Mockito 不这样做)。
我的问题是:我的第一个测试(从BlockAbstractFactory 调用方法getBlockList())通过了,尽管generateBlocks() 中没有实现。我已经在BlockAbstractFactory 中实现了静态方法(目前返回null),以避免Eclipse 语法错误。
如何测试静态方法是否在fileGerator.generateBlocks()内被调用?
到目前为止,这是我的测试课:
@RunWith(PowerMockRunner.class)
public class testFileGenerator {
FileGenerator fileGenerator = new FileGenerator();
@Test
public void shouldCallGetBlockList() {
fileGenerator.setFileType(FileTypeEnum.SPED_FISCAL);
fileGenerator.generateBlocks();
PowerMockito.mockStatic(BlockAbstractFactory.class);
PowerMockito.verifyStatic();
BlockAbstractFactory.getBlockImpl(fileGenerator.getFileType());
}
}
【问题讨论】:
-
抽象方法不能是静态的
-
最简单的答案是,如果您决定进行 TDD,请改掉编写静态方法的习惯 :)
-
@ArtB 它是来自抽象类的静态方法,而不是抽象静态方法。编辑:刚刚看到我的问题中的错误。固定。
-
@Affe 好吧,如果真的没有其他办法,我会改变它......
-
不是您问题的答案,只是一个提示:在您的测试方法或@Before 中实例化您的
FileGenerator fileGenerator = new FileGenerator();,而不是作为您的测试类的成员。使用您当前的实现,您将在测试类中的测试上共享实例化的fileGenerator(假设您还需要独立测试)
标签: java junit tdd mockito powermock