假设我有实现它的接口和实现类,我想为此编写单元测试.我应该测试什么接口或Impl?
这是一个例子:
public interface HelloInterface {
public void sayHello();
}
public class HelloInterfaceImpl implements HelloInterface {
private PrintStream target = System.out;
@Override
public void sayHello() {
target.print("Hello World");
}
public void setTarget(PrintStream target){
this.target = target;
}
}
Run Code Online (Sandbox Code Playgroud)
所以,我有HelloInterface和HelloInterfaceImpl来实现它.什么是被测单元接口或Impl?
我认为它应该是HelloInterface.考虑下面的JUnit测试草图:
public class HelloInterfaceTest {
private HelloInterface hi;
@Before
public void setUp() {
hi = new HelloInterfaceImpl();
}
@Test
public void testDefaultBehaviourEndsNormally() {
hi.sayHello();
// no NullPointerException here
}
@Test
public void testCheckHelloWorld() throws Exception {
ByteArrayOutputStream out = new ByteArrayOutputStream(); …Run Code Online (Sandbox Code Playgroud) 这部分是这个问题的后续行动.
我不确定最好的方式来问这个,所以我会尝试一个简短的故事来设置场景:
曾几何时,有一个类'A',它有一个单元测试类'ATests'负责通过公共接口测试它的行为.他们幸福地在一起生活了一段时间然后发生了变化,并且"B"级出现了,因为它与"A"级有很多共同之处,因此引入了一个基类.
A类的测试已经涵盖了基类的公共行为.那么问题是接下来会发生什么?
•B类是否需要对公共(基类行为)进行测试?看起来行为是B的一部分,所以应该进行测试,但这些测试是否应该与A类共享?对于基类?如果是这样,分享的最佳方式是什么?
•新基类是否需要单元测试,或者基类是否可以通过子项测试进行测试?基类是抽象的是否重要?
•是否足以确保类A和B派生自基类并"信任"基类的单元测试以测试常见行为(因此测试不需要在子类中复制)?A&B的测试只需要测试它们是新的/改变的行为吗?
•我是否遵循完全错误的方法,每个真实班级大约有一个单元测试课程?
我在不同的时间采取了不同的观点,不同的方法会对重构代码的能力,编写测试的时间等产生相当大的影响.人们发现哪些方法效果最好?
我们正在开发一种新的API.我的同事和我对内部课程是否应该进行单元测试有不同的看法.
我的同事给出的不是单元测试内部课程的要点
我给出的分数有利于单元测试内部课程
我尝试在线搜索,但似乎没有关于此的最佳实践或标准意见.你认为一个好的方法是什么?
对java人员的注意: " internal "是C#中的一个关键字,它限制了类对程序集的可见性.在程序包/程序集之外无法访问该类.它不等同于私人阶级.