Java 无法使用@Rule&@使用注释运行,但不推荐使用的initmocks()可以工作
我正在进行一个基本的测试驱动开发,学习一个简单的java程序,为股票提供投资组合价值 我有两个类,Java 无法使用@Rule&@使用注释运行,但不推荐使用的initmocks()可以工作,java,unit-testing,mockito,junit4,junit5,Java,Unit Testing,Mockito,Junit4,Junit5,我正在进行一个基本的测试驱动开发,学习一个简单的java程序,为股票提供投资组合价值 我有两个类,Portfolio.java和Stock.java,它们描述了投资组合和股票模型。java以抽象的方式使用接口StockService.java来获取实时股票价格 PortfolioTest.java是我试图通过使用Mockito模拟这个StockService来为portfolio的特性编写单元测试的类 我能够使用弃用的MockitoAnnotations.initMocks(this)&如果尝试
Portfolio.java
和Stock.java
,它们描述了投资组合和股票模型。java以抽象的方式使用接口StockService.java
来获取实时股票价格
PortfolioTest.java
是我试图通过使用Mockito模拟这个StockService来为portfolio的特性编写单元测试的类
我能够使用弃用的MockitoAnnotations.initMocks(this)
&如果尝试使用@Rule
或@RunWith
注释,则运行我的测试,但会出现空指针异常
Stock.java
公共类股票{
私有字符串名称;
私人整数数量;
公共库存(字符串名称、整数数量){
this.name=名称;
这个。数量=数量;
}
公共字符串getName(){return name;}
public float getQuantity(){return quantity;}
}
Portfolio.java
import java.util.List;
公课档案{
私人上市股票;
私人证券服务;
私人浮动portfolioValue;
公共投资组合(上市股票、浮动组合价值){
这个。股票=股票;
this.portfolioValue=portfolioValue;
}
public void setStockService(StockService StockService){this.StockService=StockService;}
公共浮动计算器MarketValue(){
浮动市场价值=0.0f;
for(股票:this.stocks){
marketValue+=(stock.getQuantity()*stockService.getRealtimePrice(stock.getName());
}
回报市场价值;
}
公共布尔值isInProfit(){
return(portfolioValue您的POM显示您可能以某种方式混合了JUnit5和JUnit4。有两个注释将方法声明为test:
@org.junit.Test // for JUnit4
@org.junit.jupiter.api.Test // for JUnit5
如果您为JUnit4添加注释,并将测试作为JUnit4测试运行,那么一切都应该正常
但是,如果您使用JUnit5进行注释并以JUnit5测试的形式运行,情况会有所不同。JUnit5既不使用@Rule
也不使用@RunWith
,而是有自己的初始化模拟的方法。这可能解释了为什么有些东西可以工作,有些东西不能工作
简而言之,要作为JUnit5运行,您的类应该具有注释:
@ExtendWith(MockitoExtension.class)
因为@Rule
或RunWith
不再工作。此批注需要依赖项:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>2.23.0</version>
<scope>test</scope>
</dependency>
org.mockito
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.5.2</version>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>2.23.0</version>
<scope>test</scope>
</dependency>