Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法使用@Rule&@使用注释运行,但不推荐使用的initmocks()可以工作_Java_Unit Testing_Mockito_Junit4_Junit5 - Fatal编程技术网

Java 无法使用@Rule&@使用注释运行,但不推荐使用的initmocks()可以工作

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)&如果尝试

我正在进行一个基本的测试驱动开发,学习一个简单的java程序,为股票提供投资组合价值

我有两个类,
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>