gpt4 book ai didi

java - JUnit - 测试方法是否被调用

转载 作者:太空宇宙 更新时间:2023-11-04 14:18:01 25 4
gpt4 key购买 nike

我是单元测试的新手,我正在尝试测试是否已调用某个方法。有问题的方法不会返回任何内容。

public void example (boolean foo) {

if (foo) {
processFoo(foo);
}
else if (foo==false) {
processSomethingElse(foo);
}
}

我希望能够测试 processFoo 方法是否被调用,但我不知道该怎么做。

如果需要模拟,那么我必须使用JMockit。谢谢!

最佳答案

抱歉,我来晚了一点,但我有一些想法给你。

首先,您提到一个选择是使用 JMockit——这很好,因为它为您提供了很大的灵 active 。如果您使用 JMockit,那么 processFoo() 方法的可见性并不重要。让我们看看它会是什么样子:

public class Subject {

public void example (boolean foo) {
if (foo) {
processFoo(foo);
}
else if (foo==false) {
processSomethingElse(foo);
}
}

private void processFoo(boolean b) {
System.out.println("b = " + b);
}

private void processSomethingElse(boolean bb) {
System.out.println("bb = " + bb);
}

}

因此,对此选项的一个警告是,我将假设 processFoo() 是您的测试主题的一种方法,并且我将使用部分模拟来更改测试主题 - 这不是我的想法真的很喜欢这样做,但这只是一个例子。一般来说,最好只模拟测试对象的依赖关系,而不是测试对象本身的行为——我们已经建议您了!请注意,测试对象的 processFoo() 方法是私有(private)的。我将用 JMockit 的部分模拟来替换测试方法,并且该新方法的可见性不必与原始方法相匹配。

import static org.assertj.core.api.Assertions.assertThat;

import mockit.Mock;
import mockit.MockUp;
import mockit.integration.junit4.JMockit;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(JMockit.class)
public class SubjectTest {

private Subject testSubject = new Subject();
private boolean processFooCalled = false;

@Before
public void setup() {
new MockUp<Subject>() {
@Mock
public void processFoo(boolean b) {
processFooCalled = true;
};
};
}

@Test
public void should_call_processFoo() {
testSubject.example(true);
assertThat(processFooCalled).isTrue();
}

@Test
public void should_not_call_processFoo() {
testSubject.example(false);
assertThat(processFooCalled).isFalse();
}

}

好的,这是第一个选择。如果您忘记了 JMockit,这实际上会更容易一些,假设您能够子类化您的测试主题并重写 processFoo() 方法:

public class Subject {

public void example (boolean foo) {
if (foo) {
processFoo(foo);
}
else if (foo==false) {
processSomethingElse(foo);
}
}

protected void processFoo(boolean b) { // NOTE: protected access here!
System.out.println("b = " + b);
}

private void processSomethingElse(boolean bb) {
System.out.println("bb = " + bb);
}

}

因此,在这种情况下,策略只是对您的测试主题进行子类化并替换您希望观察被调用的方法的实现。它可能看起来像这样:

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.Test;

public class SubjectTest2 {

private Subject testSubject = new TestableSubject();
private boolean processFooCalled = false;

@Test
public void should_call_processFoo() {
testSubject.example(true);
assertThat(processFooCalled).isTrue();
}

@Test
public void should_not_call_processFoo() {
testSubject.example(false);
assertThat(processFooCalled).isFalse();
}

class TestableSubject extends Subject {
@Override
protected void processFoo(boolean b) {
processFooCalled = true;
}
}
}

试一试。希望对您有帮助!

关于java - JUnit - 测试方法是否被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27490799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com