2

如何使用模拟对象测试此类:

我的班级{

     MyStudent mystudent=null; 
     Mymethod mymethod= new Mymethod ();

     public void show(String data){ 
         mystudent=mymethod.display(data);

     }
  }

这里mymethod.display()方法返回一个实例mystudent

4

1 回答 1

1

如果我正确理解您的问题,您会想要一个在一个简单示例上使用模拟的 junit 测试示例。使用 Junit4 和mockito ,您的 junit 测试将如下所示:

测试测试.java

import static org.junit.Assert.assertNotNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.mockito.Matchers.anyString;

import org.junit.Before;


public class TestTest {
    private Test test;
    private Totest totest;

    @Before
    public void setup(){
        totest = mock(Totest.class);
        test = new Test(totest);
    }

    @org.junit.Test
    public void mytest_should_not_be_null_after_I_called_displayed(){
        when(totest.display(anyString())).thenReturn(new Mytest());
        test.myMethod("some data");
        assertNotNull(test.getMytest());
    }
}

setup方法使用@Before注释进行注释。它在此测试类的任何测试用例运行之前执行。测试用例用@Test注释。它只是在调用方法display后检查字段mytest是否为非空。

你需要像这样改进你的测试类:

class Test{ 

     private Mytest mytest=null; 
     private final Totest totest;

     public Test(Totest totest) {
         this.totest = totest;
     }

     public void myMethod(String data){ 
         mytest = totest.display(data);
     }

    public Mytest getMytest() {
        return mytest;
    }

 }

您应该注意构造函数,它将 Totest 实例作为参数。此类的 totest 字段成为最终字段,因为唯一允许设置它的代码是您的构造函数。这样您就可以在 Test 类中注入任何 Totest 实例。这是某种依赖注入(如何将依赖注入到类中的示例,但还有其他方法可以做到这一点,您也可以使用简单的 setter,我只是更喜欢将我的依赖声明为 final,因为它在我看来更清楚)。那么为什么我在你的小例子中使用了 DI 呢?因为我需要在 Test 中注入一个 Totest 的实例。我在单元测试中注入的实例只是一个模拟。测试用例的第一行定义了调用显示时模拟实例的行为。

我希望它有一些意义。

于 2012-09-10T09:42:53.313 回答