JUnit规则
在以上示例中, 我们使用了JUnit运行器(MockitoJUnitRunner)。它使测试依赖于该特定跑步者。
我们不能在同一测试中使用多个跑步者。为克服此问题, 我们应遵循使测试更加灵活的JUnit规则。它允许我们在同一测试中使用多个规则。
JUnit规则被定义为用于阻塞测试方法调用的组件, 并允许我们在调用测试方法之前和之后执行某些操作。 JUnit提供以下规则:
- 创建运行测试方法后删除的目录/文件。
- 如果在调用测试方法之前超过了所描述的超时, 则使测试失败。
- 在调用测试方法之前, 请建立一个外部资源, 例如套接字或数据库连接。
- 调用测试方法后, 释放配置的外部资源。
要使用JUnit规则, 我们需要在测试中添加@Rule批注。
@Rule:注释字段。它指的是返回规则的规则或方法。带注释的字段必须是公共的, 非静态的以及TestRule或MethodRule的子类型。
@Rule
public MockitoRule mockitorule = MockitoJUnit.rule();
在上面的代码片段中, 我们使用了MockitoRule类。你可以根据需要使用任何JUnit规则。
JUnit规则(MockitoRule)的示例
在这里, 我们将使用JUnit规则创建一个示例。在此示例中, 我们使用MockitoRule, 并且可以根据你的要求使用任何JUnit规则。
步骤1:创建一个名为ToDoService的接口, 其中包含两个未实现的方法。
ToDoService.java
import java.util.List;
public interface ToDoService {
public List<String> getTodos(String user);
public void deleteTodos(String doString);
}
步骤2:创建一个名为ToDoBusiness的实现类。
ToDoBusiness.java
import java.util.ArrayList;
import java.util.List;
// ToDoBusiness is a SUT (system under test)
// ToDoService is a Dependency (as ToDoBusiness is dependent on it)
public class ToDoBusiness {
public ToDoService doService;
public ToDoBusiness(ToDoService doService) {
this.doService = doService;
}
public void deleteTodosNotRelatedToHibernate(String user) {
List<String> Combinedlist = doService.getTodos(user);
for(String todos:Combinedlist) {
if(!todos.contains("Hibernate"))
{
doService.deleteTodos(todos);
}
}
}
}
步骤3:创建一个名为ToDoBusinessMock的测试类, 其中定义了业务逻辑。
ToDoBusinessMock.java
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.BDDMockito.then;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import java.util.Arrays;
import java.util.List;
import org.junit.Rule;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
public class ToDoBusinessMock {
@Rule
public MockitoRule mockitorule = MockitoJUnit.rule();
@Mock
ToDoService servicemock;
@InjectMocks
ToDoBusiness business;
@Captor
ArgumentCaptor<String> argumentCaptor;
@Test
public void deleteTodosusing_BDD() {
// Given
List<String> combinedlist = Arrays.asList("Use Hibernate Java", "Use Hibernate Core", "Use Hibernate", "Use Spring MVC");
given(servicemock.getTodos("dummy")).willReturn(combinedlist);
// When
business.deleteTodosNotRelatedToHibernate("dummy");
// Then
verify(servicemock, times(1)).deleteTodos("Use Spring MVC");
verify(servicemock, never()).deleteTodos("Use Hibernate Java");
verify(servicemock, never()).deleteTodos("Use Hibernate");
System.out.println("test is working..");
}
@Test
public void deleteTodosusing_BDD_usingArgumentCaptor() {
//Given
List<String> combinedlist = Arrays.asList("Use Hibernate Java", "Use Hibernate Core", "Use Hibernate", "Use Spring MVC");
given(servicemock.getTodos("dummy")).willReturn(combinedlist);
//When
business.deleteTodosNotRelatedToHibernate("dummy");
//Then
then(servicemock).should().deleteTodos(argumentCaptor.capture());
assertThat(argumentCaptor.getValue(), is("Use Spring MVC"));
System.out.println("test is working..");
}
}
输出如下
以下输出显示使用JUnit规则(MockitoRule)成功运行了测试。
评论前必须登录!
注册