2017-09-16 64 views
1

我正在学习如何在android studio中进行单元测试。如下所示,我有一个名为“isValidUrl”的方法,在下面的测试部分中,我使用Mockito编写了该方法的测试 ,但测试总是失败。如何测试方法在Mockito中返回布尔值

你可以请帮忙,并指导我如何测试这种方法?

代码

public boolean isValidUrl(String url) { 
    return (url != null && !url.equals("")) ? true : false; 
} 

测试

public class ValidationTest { 
@Mock 
private Context mCtx = null; 

@Before 
public void setUp() throws Exception { 
    mCtx = Mockito.mock(Context.class); 
    Assert.assertNotNull("Context is not null", mCtx); 
} 

@Test 
public void isValidUrl() throws Exception { 
    Validation validation = new Validation(mCtx); 
    String url = null; 
    Mockito.when(validation.isValidUrl(url)).thenReturn(false); 
} 

}

回答

1

因为你想嘲笑 '真正的' 对象的行为你得到一个异常(validation)。

你需要分开两件事:嘲弄断言

惩戒方法创建一个类的“假”的对象(比如你Context所做的那样),并在测试之前确定自己的行为。 在你的情况

Mockito.when(validation.isValidUrl(url)).thenReturn(false); 

手段,你告诉validation对象返回false如果isValidUrl(url)被调用。尽管你只能用嘲弄的对象来做到这一点,但在你的情况下,无论如何都没有意义,因为你想测试你的类的“真实”行为,而不是模拟对象的行为。 Mocking方法通常用于定义类的依赖关系的行为,在这种情况下,还是Context。 为了您的测试在这里,这不是必要的。

声明然后做测试类应该如何表现的实际“测试”。

你想测试isValid()urlnull返回false:

Assert.assertEquals(validation.isValid(null), false); 

或更短:

Assert.assertFalse(validation.isValid(null)); 

您可以使用assertEqualsassertFalseassertTruesome others验证您的isValid()方法返回您希望它返回给定url参数的内容。

+0

谢谢你的答案..但我可以在同一个方法中使用多个断言..因为我想测试isValid(null),isValid(true)和isValid(false) – user2121

+0

@ user2121是的,你可以。这是一个有趣的问题,大多数人会建议你为每种情况做一个额外的测试方法,但是你也可以在一种测试方法中进行尽可能多的断言。 – FWeigl

+0

谢谢..我在这里发布了另一个与测试有关的问题:https:// stackoverflow。com/questions/46262467/how-to-test-picasso-using-unit-test-and-mockito也许你想看看,你的答案对我来说是一个指导性的线索,因为我是学习测试单位 – user2121