Java JUnit的继承
我有两个班(B&C)是从A延伸而来的 我正试图以一种我可以通过B和C的具体实现并让它们运行的方式编写一个单元测试。例如:Java JUnit的继承,java,mockito,junit4,Java,Mockito,Junit4,我有两个班(B&C)是从A延伸而来的 我正试图以一种我可以通过B和C的具体实现并让它们运行的方式编写一个单元测试。例如: abstract class A { abstract doSomething(); public static void send(A a){ // sends a off } } class B extends A { public void doSomething(){ this.send(this) } class C e
abstract class A {
abstract doSomething();
public static void send(A a){
// sends a off
}
}
class B extends A {
public void doSomething(){
this.send(this)
}
class C extends A {
public void doSomething(){
this.send(this);
this.write(this)
}
public void write(A a){
//writes A to file
}
}
//setup junit testsuite info
class TestClassA {
private A theClass;
public void testDoSomething(){
this.theClass.doSomething();
}
}
// would like to be able to do
class Runner {
B b = new B();
C c = new C();
// run TestClassA with b (I know this doesnt work, but this is what I'd like to do)
TestClassA.theClass = b;
TestClassA.run();
// run TestClassA with c (I know this doesnt work, but this is what I'd like to do)
TestClassA.theClass = c;
TestClassA.run();
}
现在,我正在寻找一种抽象地进行单元测试的方法,只需传入实现并让单元测试运行即可。例如:
abstract class A {
abstract doSomething();
public static void send(A a){
// sends a off
}
}
class B extends A {
public void doSomething(){
this.send(this)
}
class C extends A {
public void doSomething(){
this.send(this);
this.write(this)
}
public void write(A a){
//writes A to file
}
}
//setup junit testsuite info
class TestClassA {
private A theClass;
public void testDoSomething(){
this.theClass.doSomething();
}
}
// would like to be able to do
class Runner {
B b = new B();
C c = new C();
// run TestClassA with b (I know this doesnt work, but this is what I'd like to do)
TestClassA.theClass = b;
TestClassA.run();
// run TestClassA with c (I know this doesnt work, but this is what I'd like to do)
TestClassA.theClass = c;
TestClassA.run();
}
有人对如何实现这一目标有什么想法吗 @RunWith(参数化的.class)
@RunWith(Parameterized.class)
public class ATest {
private A theClass;
public ATest(A theClass) {
this.theClass= theClass;
}
@Test
public final void doSomething() {
// make assertions on theClass.doSomething(theClass)
}
@Parameterized.Parameters
public static Collection<Object[]> instancesToTest() {
return Arrays.asList(
new Object[]{new B()},
new Object[]{new C()}
);
}
}
公开课考试{
私人阶级;
公开考试(A类){
this.theClass=theClass;
}
@试验
公开最终无效剂量(){
//对类进行断言。doSomething(类)
}
@参数化。参数化
公共静态集合instancesToTest(){
返回数组.asList(
新对象[]{new B()},
新对象[]{new C()}
);
}
}
我将您的TestClassA类重命名为MyController,因为听起来MyController是测试系统的一部分。这样,您就可以用B和C类对其进行测试,如下所示:
public class HelloContTest {
@Test
public void testSomethingWithB() throws Exception {
MyController controller = new MyController();
controller.setTheClass(new B());
controller.doSomething();
}
@Test
public void testSomethingWithC() throws Exception {
MyController controller = new MyController();
controller.setTheClass(new C());
controller.doSomething();
}
}
A、 B和C都是混凝土。它还取决于每个实例正在做什么;如果他们在做不同的事情,那么以不同的方式测试他们是有意义的。如果他们正在做与父类相同的事情,那么只测试父类而不去管其他两个是有意义的。A是抽象的。固定上面他们做不同的事情,但他们在做他们在同一方法只是不同的工作流为每个实现。最后,方法签名都是一样的。首先,看起来您的测试系统就是doSomething()方法。为了测试这一点,您将需要某种类型的输出,这些输出可以被验证。一般来说,返回void的单元测试方法没有意义,除非您只是想验证它没有抛出异常,它会将某些内容保存到数据库或磁盘。我正在验证是否已完成保存。它目前没有返回任何内容。将来可能是一个布尔值。注意,这只能验证在不引发任何异常的情况下调用该方法。如果实现方法引发异常,testrunner将用错误标记它。我发现这比添加逻辑来验证没有抛出异常要简单。