【问题标题】:JMockit @Tested field with Specific Constructor具有特定构造函数的 JMockit @Tested 字段
【发布时间】: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


【解决方案1】:

我不想更改任何生产代码来运行 JMockit 测试用例。但我必须添加一个方法来模拟它。如果有更好的想法,我将不胜感激。

public class MagazineFetcher {  

    @EJB private StatisticDAO statisticDao;

    // configs
    private long maxSizeByte;

    // Method is added only for Testcase
    long getMaxSizeByte() { return maxSizeByte;  }

    public MagazineFetcher() {
        maxSizeByte = ProjectConfig.getCdsMaxChannelSizeByte();
    }
    // No need to add a constructor
    // public MagazineFetcher(long maxSizeByte) {
    //  this.maxSizeByte = maxSizeByte;
    // }

    public void doSomething(){
        // using maxSizeByte field is replaced by getMaxSizeByte() 
        if ( ... < getMaxSizeByte() ) 
            ....
    }
}

测试用例

public class MagazineFetcherTest {
    @Injectable private StatisticDAO statisticDao;

    @Tested private MagazineFetcher magazineFetcher ;

    @Test
    public void testInvalidImportFile() throws Exception {

        new MockUp<MagazineFetcher>(){
            @Mock
            long getMaxSizeByte() {
                return 1024 * 1024 * 250;
            }
        };

        magazineFetcher.doSomething();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-03
    • 2019-03-24
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多