【发布时间】:2019-03-21 13:58:29
【问题描述】:
我正在尝试使用 JMockit 1.45 模拟一个类。
由于删除了 Deencapsulation.setField 方法,我无法设置私有字段值。因此,我正在寻找一种在启动类时设置私有字段值的方法。我添加了一个额外的构造函数来设置一个私有字段值。但是,我找不到使用带有特定构造函数的@Tested 注释来获取属性设置实例的方法。还有其他方法吗?
“long maxSizeByte”应由 Configuration 设置,我需要测试该方法是否适用于各种值。
代码示例制作类
public class MagazineFetcher {
@EJB private StatisticDAO statisticDao;
// configs
private long maxSizeByte;
public MagazineFetcher() {
this(ProjectConfig.getCdsMaxChannelSizeByte());
}
// This constructor is adde for a testcase to set the private value
public MagazineFetcher(long maxSizeByte) {
this.maxSizeByte = maxSizeByte;
}
// using maxSizeByte field for a calcuation and validation
public void doSomething(){
}
}
测试用例
public class MagazineFetcherTest {
@Injectable private StatisticDAO statisticDao;
@Tested private MagazineFetcher magazineFetcher ;
@Test
public void testInvalidImportFile() throws Exception {
magazineFetcher.doSomething();
}
}
似乎@Tested private MagazineFetcher magazineFetcher 仅由默认构造函数实例化。我正在寻找由另一个构造函数发起的方式。当我只是 MagazineFetcher magazineFetcher = new MagazineFetcher(100 * 1024) 时,我会得到一个未注入 statisticDao 的实例。
【问题讨论】:
-
您是否尝试指定要注入到
@Tested对象中的long maxSizeByte值。与您已经注入 DAO 的方式相同... -
@Rogério 根据 JMockit 教程,@Injectable 将适用于剩余的未初始化字段。 @Injectable tutorial“被测试的类被选择的构造函数初始化,它剩余的未初始化的非最终实例字段被考虑注入。”这些字段已经由构造函数初始化。但是,我刚刚尝试过。它没有被注入。
-
我有个主意。我可以为
long maxSizeByte添加一个getter 方法并重构tested(MagazineFetcher) 类以仅引用getter 方法而不是直接访问该字段。然后我可以伪造getter方法。我需要再次使用 Mocking 和 Facking API 进行测试。这可能不是一个好主意。但是,我没有找到其他方法。
标签: unit-testing jmockit