1

我有以下课程。

public Task {

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

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

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

4

2 回答 2

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);
}

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

于 2013-07-17T20:31:11.000 回答
0

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

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

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

于 2013-07-17T15:00:53.203 回答