如何模拟在jmock测试中读取属性文件返回的值

时间:2016-04-27 17:25:48

标签: java unit-testing properties jmock

我有一个单例java属性类(RepositoryProperties.java),它从文本文件中读取以获取readFromSql方法返回的值:

public boolean readFromSql() {
    String lPhase = getPilotProfileDatabaseTransitionPhase();
    if (lPhase.equals("PHASE_ONE_SQL")) {
        return true;
    } else
        return false;
}

然后,当我想通过我的存储库实现类添加记录时,我必须检查此值以了解要执行的代码块:

if (RepositoryProperties.getInstance().readFromSql()
      {

..如果为true,则将数据写入SQL,否则跳过此块

现在我需要为我的存储库添加方法添加一个Jmock单元测试,以便readFromSql方法返回true(另一个测试将测试false值),而不会对文本文件产生依赖性。我担心jmock对我来说是全新的,我无法弄清楚如何模拟readFromSql返回的值。我没有setter方法。

我尝试为此添加一个期望,但这不是正确的方法(不要认为这属于预期)并且我的语法也是错误的:

myMockContext.checking(new Expectations() {
{
        RepositoryProperties.getInstance().readFromSql();
        will(returnValue(true));

非常感谢有关如何正确地做到这一点的一点指导。

1 个答案:

答案 0 :(得分:0)

JMock通常是围绕模拟接口实例的想法而设计的。您可以将其用于模拟类的实例,但不建议这样做。你要做的甚至更多 - 你想要模拟一个静态方法。这非常违背JMock的理念,Jmock会在每一步都为你而战。您可能希望查看替代模拟框架,例如PowerMockMockito,它们可以更灵活地在没有明确测试接缝(即注入接口)的情况下使用模拟。

此外 - 单身人士模式现在相当老派。使用该模式实现的单身人士会像您所看到的那样创建测试问题,并且通常可以使用DI范围更有效地实现对单例行为的真正需求。在这种情况下,您可能需要考虑对单例的需求 - 您可以更改吗?