如何为接口编写 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:类名
请帮助编写 Junit 作为接口默认方法。
public interface ABC<T, D, K, V> {
default List<String> getSrc(DEF def, XYZ xyz) throws Exception {
}
}
ABC:接口名称。DEF 和 XYZ:类名
如果您使用的是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中继续工作。
如答案中所示,为接口创建实现类并对其进行测试,例如我在接口中修改了方法,如下所示:getSrc
ABC
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"));
}
}