当在Java中模拟一个方法时,根据传入的参数接收不同的响应可能是有用的。在本文中,我们将根据不同的复杂性要求,探讨实现这一目标的不同方式。
2. 设置
首先,让我们创建一个我们想要模拟的示例服务:
class ExampleService {
int getValue(int arg){
return 1;
}
}
当在Java中模拟一个方法时,根据传入的参数接收不同的响应可能是有用的。在本文中,我们将根据不同的复杂性要求,探讨实现这一目标的不同方式。
首先,让我们创建一个我们想要模拟的示例服务:
class ExampleService {
int getValue(int arg){
return 1;
}
}
在本教程中,我们将学习三种不同的方法来覆盖Cucumber选项值。从优先级的角度来看,Cucumber将解析并覆盖以下来源的选项:
为了展示每种方法,我们将运行一个简单的特性文件,包含两个场景,并覆盖Cucumber的_tags_选项。
在介绍每种方法之前,我们需要做一些初始设置。首先,让我们添加_cucumber-java, cucumber-junit, cucumber-spring,_和_junit-vintage-engine_依赖项:
在本教程中,我们将了解如何在单元测试方法参数中注入 @Mock 和 @Captor 注解。
我们可以使用 @Mock 在单元测试中创建模拟对象。另一方面,我们可以使用 @Captor 捕获并存储传递给模拟方法的参数,以便稍后进行断言。JUnit 5 的引入使得将参数注入测试方法变得非常容易,从而实现了这一新特性。
要使用此功能,我们需要使用 JUnit 5。库的最新版本可以在 Maven Central Repository 中找到。让我们将依赖项添加到我们的 pom.xml 中:
```<dependency>```
```<groupId>```org.junit.jupiter```</groupId>```
```<artifactId>```junit-jupiter-engine```</artifactId>```
```<version>```5.10.2```</version>```
```<scope>```test```</scope>```
```</dependency>```
当我们测试代码时,有时我们想要捕获传递给方法的参数。
在本教程中,我们将学习如何使用Spock测试中的_Stubs_、_Mocks_和_Spies_来捕获参数,并检查我们捕获的内容。我们还将学习如何验证对同一_Mock_的多次调用使用不同的参数,并断言这些调用的顺序。
首先,我们需要一个接受我们想要捕获的单个参数或参数的方法。
让我们创建一个_ArgumentCaptureSubject_类,它有一个_catchMeIfYouCan()_方法,该方法接受一个_String_并返回它,前面加上“Received ”:
在Java中模拟受保护的方法与模拟公共方法类似,但有一个问题:测试类中该方法的可见性。我们可以从同一包中的类和继承自A类的类中看到类A的受保护方法。因此,如果我们尝试从不同包中测试类A,我们将面临问题。
在本教程中,我们将探讨在测试中模拟受保护方法的情况。我们将演示两种情况:可以访问该方法和不能访问。我们将使用Mockito间谍而不是模拟,因为我们只想存根测试类中的某些行为。
当我们可以访问Mockito中的受保护方法时,模拟是直接的。我们可以通过两种方式获得访问权限。首先,将受保护的范围更改为公共,或者第二,将测试类移动到与具有受保护方法的类相同的包中。
本教程将讨论在JUnit 4中跳过运行基测试类中测试的可能解决方案。在本教程中,基类仅包含辅助方法,而子类将扩展它并运行实际测试。
假设我们有一个包含一些辅助方法的_BaseUnitTest_类:
public class BaseUnitTest {
public void helperMethod() {
// ...
}
}