不使用JMockit调用/调用验证私有构造函数

时间:2013-07-17 14:57:03

标签: java unit-testing junit junit4 jmockit

我有以下课程。

public Task {

    public static Task getInstance(String taskName) {
        return new Task(taskName);
    }

    private Task(String taskName) {
        this.taskName = taskName;
    }
}

我正在使用JMockit测试Task.getInstance()。在我测试时,我需要验证是否实际调用了private Task()。我之前使用Verifications块来验证测试夹具对象上的方法执行,但是我没有这个。

2 个答案:

答案 0 :(得分:3)

这可以做到,虽然很可能不应该进行任何正确的书面测试:

@Test
public void badTestWhichVerifiesPrivateConstructorIsCalled()
{
    new Expectations(Task.class) {{ // partially mocks `Task`
        // Records an expectation on a private constructor:
        newInstance(Task.class, "name");
    }};

    Task task = Task.getInstance("name");

    assertNotNull(task);
}

@Test
public void goodTestWhichVerifiesTheNameOfANewTask()
{
    String taskName = "name";

    Task task = Task.getInstance(taskName);

    assertNotNull(task);
    assertEquals(taskName, task.getName());
}

@Test
public void goodTestWhichVerifiesANewTaskIsCreatedEverytime()
{
    Task task1 = Task.getInstance("name1");
    Task task2 = Task.getInstance("name2");

    assertNotNull(task1);
    assertNotNull(task2);
    assertNotSame(task1, task2);
}

同样,一般来说,应该避免局部模拟和私有方法/构造函数的模拟。

答案 1 :(得分:0)

我认为您通常不应该测试私有方法的调用。

重要的是您的投入能够提供正确的输出。我通常希望测试是黑盒子。即你可以改变实现,但是在给定相同输入的情况下,组件仍会给出正确的输出。

如果您测试私有方法之类的东西,那么您的测试将对重构非常敏感,并且它们作为回归测试的功能将受到限制,因为您必须将测试与您的重构一起重构主要代码重构。