单元测试依赖EJB和UserTransaction的类

时间:2015-07-20 17:23:07

标签: unit-testing junit mocking ejb mockito

如何为接收EJBContext对象的类编写单元测试? 即

viewDidAppear

我正在使用mockito和Junit。我已经学习了很多初学者的教程,并且找不到我想要测试的类的任何可靠内容。

到目前为止,我已经通过了这个:

public class MyProcessor {    

public MyProcessor (EJBContext ejbContext, SomePojo somePojo) { }

    ReturnObject saveMethod(InputObject inputObject){
         UserTransaction utx = this.context.getUserTransaction();

          try {
             utx.begin();
             ....
             ....
              }
     return ReturnObject;
    }
}

我不确定这实际上是做什么的,如果这是正确的方法。

许多模拟示例使用" new"用于实例化我正在测试的类的关键字。但是当我在MyProcessor上调用new关键字时,我猜想模拟了EJBContext和SomePojo,但是我得到了一个java.lang.NullPointerException 我执行此操作时UserTransaction utx中的错误。

更新: 感谢RadekSohlich的回答,我使用了InjectMocks注释并且没有使我的处理器类成为我正在做的模拟(当然是错误的)。

另一个有趣的事情是,我不得不嘲笑UserTransaction,并利用Mockito"当"告诉它使用该模拟的关键字。否则我会有一个nullpointerException。

以下是有效解决方案的示例:

@Mock
@RunWith(MockitoJUnitRunner.class)
public class MyProcessorTest{

@Mock
MyProcessor myProcessor;

    @Test
public void testSaveNewAssignment() {   

    InputObject inputObject= new InputObject();

    ReturnObject returnObject = new ReturnObject();

    when(myProcessor.saveMethod(inputObject)).thenReturn(returnObject);

    ReturnObject actualReturnObject= myProcessor.saveMethod(inputObject);

    assertSame(returnObject, actualReturnObject);

}

1 个答案:

答案 0 :(得分:1)

关键是要为测试bean所依赖的对象使用注释@Mock作为对象/ bean。例如,我测试类AssignmentRest,它依赖于AssignmentRepository,FileRepository,SubmissionHelper和PluginService类,因此您必须模拟所有bean并对测试中的bean使用注释@InjectMocks。见例:

public class AssignmentRestTest extends GenericTest {

@Mock AssignmentRepository assignmentRepo;
@Mock FileRepository fileRepo;
@Mock SubmissionHelper submissionHelper;
@Mock PluginService pluginHolder;

@InjectMocks AssignmentRest assignRest;

public AssignmentRestTest() throws IOException {
    super();
}

@Before
public void setUp() {
    MockitoAnnotations.initMocks(this);
    mockMvc = MockMvcBuilders.standaloneSetup(assignRest).build();
    RestAssuredMockMvc.mockMvc = mockMvc;
    presetBeans();
}

public void presetBeans() {
    //Preset the return values
    Mockito.when(pluginHolder.isSupportedLang(anyString())).thenReturn(Boolean.TRUE);
    Mockito.when(assignmentRepo.save(any(Assignment.class))).thenReturn(new Assignment("1234", "rada", "C", "Test", "NEW", new Date()));
}

@Test
public void testCreateAssignment() {
    given().body("{\"owner\":\"rada\",\"name\": \"CHistory\",\"lang\": \"C\",\"assignmentId\": \"0\"}")
            .contentType("application/json")
            .when().
            post("/rest/assignment/create").
            then().
            statusCode(HttpServletResponse.SC_OK);
}


@Test
public void testGetAll(){
given().
            when().
            get("/rest/assignment/all/rada").
            then().
            statusCode(HttpServletResponse.SC_OK);
}

}