如何为接口编写 Junit 默认方法

2022-09-02 09:22:45

请帮助编写 Junit 作为接口默认方法。

public interface ABC<T, D, K, V> {
    default List<String> getSrc(DEF def, XYZ xyz) throws Exception {
    }
}

ABC:接口名称。DEF 和 XYZ:类名


答案 1

如果您使用的是Mockito,那么对默认(又名“防御者”)方法进行单元测试的最简单方法是使用接口类文字2制作间谍1。然后,可以像往常一样在返回的间谍实例上调用默认方法。下面的示例演示:

import org.junit.Test;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.spy;

interface OddInterface {
    // does not need any unit tests because there is no default implementation
    boolean doSomethingOdd(int i);

    // this should have unit tests because it has a default implementation
    default boolean isOdd(int i) {
        return i % 2 == 1;
    }
}

public class OddInterfaceTest {
    OddInterface cut = spy(OddInterface.class);

    @Test
    public void two_IS_NOT_odd() {
        assertFalse(cut.isOdd(2));
    }

    @Test
    public void three_IS_odd() {
        assertTrue(cut.isOdd(3));
    }
}

(使用 Java 8 和 mockito-2.24.5 进行测试

1 个人们经常警告使用间谍可以指示代码或测试气味,但测试默认方法是使用间谍是一个好主意的完美示例。

阿拉伯数字截至撰写本文时(2019年),接受类文字的间谍签名被标记为@Incubating,但自2014年发布的mojito-1.10.12以来一直存在。此外,Mockito中对默认方法的支持2016年发布的motica-2.1.0以来一直存在。可以肯定的是,这种方法将在未来版本的Mockito中继续工作。


答案 2

如答案中所示,为接口创建实现类并对其进行测试,例如我在接口中修改了方法,如下所示:getSrcABC

import java.util.ArrayList;
import java.util.List;

public interface ABC<T, D, K, V> {

    default List<String> getSrc(DEF def, XYZ xyz) {
        final List<String> defaultList = new ArrayList<>();
        defaultList.add("default");
        defaultList.add("another-default");
        return defaultList;
    }
}

为同一个实现类创建了一个实现类,您可以选择创建另一个调用super method的方法并为两者编写,就像我所做的那样:@Test

import java.util.List;

public class ABCImpl implements ABC<String, Integer, String, Integer> {

    public List<String> getSrcImpl(DEF def, XYZ xyz) {
        final List<String> list = getSrc(def, xyz);
        list.add("implementation");
        return list;
    }
}

实现的对应测试类如下:

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.contains;
import java.util.Collection;
import java.util.List;

import org.junit.Before;
import org.junit.Test;

public class ABCImplTest {

    private ABCImpl abcImpl;

    @Before
    public void setup() {
        abcImpl = new ABCImpl();
    }

    @Test
    public void testGetSrc() throws Exception {
        List<String> result = abcImpl.getSrc(new DEF(), new XYZ());
        assertThat((Collection<String>) result, is(not(empty())));
        assertThat(result, contains("default", "another-default"));
    }


    @Test
    public void testABCImplGetSrc() throws Exception {
        List<String> result = abcImpl.getSrcImpl(new DEF(), new XYZ());
        assertThat((Collection<String>) result, is(not(empty())));
        assertThat(result, contains("default", "another-default", "implementation"));
    }
}

推荐