2017-06-16 57 views
0

所以我打破我的代码位,使之更普遍,也更容易让别人用类似问题的Mockito当()不工作

这是我的主要代码明白:

protected void methodA(String name) { 
     Invocation.Builder requestBuilder = webTarget.request(); 
     requestBuilder.header(HttpHeaders.AUTHORIZATION, authent.getPassword()); 

      response = request.invoke(); 

      if (response.equals("unsuccessfull")) { 
       log.warn("warning blabla: {} ({})"); 
      } else { 
       log.info("info blabla {}"); 
      } 
     } 
    } 
} 

而我的测试代码如下所示:

@Test 
public void testMethodA() throws Exception {    
    final String name = "testName"; 

    this.subject.methodA(name); 

    Authent authent = Mockito.mock(Authent.class); 

    when(authent.getPassword()).thenReturn("testPW"); 
    assertEquals(1, logger.infos.size()); 

} 

正如我所说的代码是更复杂的我打破了下来,并使其更短.....希望它仍然是可读的。

我的问题不是我的when().thenReturn()不起作用,因此我的代码不会进一步......我猜我的嘲笑由于某种原因无法正常工作。

回答

1

您测试methodA()方法,但你嘲笑Authent类和调用测试方法之后录制的行为吧:

this.subject.methodA(name); 
Authent authent = Mockito.mock(Authent.class); 
when(authent.getPassword()).thenReturn("testPW"); 

这是无奈的方法来测试已经调用。
应该以相反的方式来完成:

Authent authent = Mockito.mock(Authent.class); 
when(authent.getPassword()).thenReturn("testPW"); 
this.subject.methodA(name); 

此外,嘲笑一个目的是第一步。
如果模拟对象未与测试对象关联,则它不会影响被测对象。

你应该做一些这样的:

Authent authent = Mockito.mock(Authent.class); 
// record behavior for the mock 
when(authent.getPassword()).thenReturn("testPW"); 

// create the object under test with the mock 
this.subject = new Subject(authent); 

// call your method to test 
this.subject.methodA(name); 

// do your assertions 
... 
+0

这里藏汉我得到一个空指针异常,因为AUTHENT是“空”即使我实现它,你在这里做 – Nali

+0

你确定了'主题(Authent Authent);'构造函数将'authent'参数赋值给它的'Authent authent'字段? – davidxxx

+0

是的我在我的主类和具有以下代码'this.authent = authent;' – Nali

1

您必须调用该方法测试之前嘲笑。 你也必须将这个模拟注入你的课堂。

随着增加结构的意见,这将是这样的:

@Test 
public void testMethodA() throws Exception {    
    // Arrange 
    final String name = "testName"; 
    Authent authentMock = Mockito.mock(Authent.class); 
    when(authentMock.getPassword()).thenReturn("testPW"); 

    this.subject.setAuthent(authentMock); 

    // Act 
    this.subject.methodA(name); 

    // Assert 
    assertEquals(1, logger.infos.size()); 

} 
+0

现在我得到一个空指针异常,因为虽然我在这里实现它,但authenticntMock为“null” – Nali

+0

尝试添加在您的测试类 –

+0

创建this.subject实例的代码好吧我得到了问题我在我的主类自动装配的其他领域似乎现在是空的,我想我必须嘲笑他们,即使我没有想要?如果它们用于被测方法中,则为 – Nali