Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.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 模拟-缺少方法调用异常_Java_Junit_Mocking - Fatal编程技术网

Java 模拟-缺少方法调用异常

Java 模拟-缺少方法调用异常,java,junit,mocking,Java,Junit,Mocking,我有一个简单的java程序,它有一个服务类,检索比特币的当前欧元价格——BitCoinValueService.java。BitCoinPricer类获取从BitCoinValueService类提供的数字并将其转换为美元 目标是从BitCoinValueService类中模拟对象,因为该数字会频繁波动 以下是测试类代码: @RunWith(JUnitParamsRunner.class) public class BitcoinPricerTest { @Mock BitCo

我有一个简单的java程序,它有一个服务类,检索比特币的当前欧元价格——BitCoinValueService.java。
BitCoinPricer
类获取从
BitCoinValueService
类提供的数字并将其转换为美元

目标是从
BitCoinValueService
类中模拟对象,因为该数字会频繁波动

以下是测试类代码:

@RunWith(JUnitParamsRunner.class)
public class BitcoinPricerTest {

    @Mock
    BitCoinValueService bsp; 

    @Before
    public void initMocks(){
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testMock (){
        BitCoinPricer bp = new BitCoinPricer(bsp);
        Mockito.when(bsp.findPrice()).thenReturn(6000.00);

        assertEquals(bp.convertEuro(bsp.findPrice()),6000.00,1.0);
        Mockito.verify(bsp).findPrice();
    }
 }
堆栈跟踪:

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'.
For example:
    when(mock.getArticles()).thenReturn(articles);

Also, this error might show up because:
1. you stub either of: final/private/equals()/hashCode() methods.
   Those methods *cannot* be stubbed/verified.
   Mocking methods declared on non-public parent classes is not supported.
2. inside when() you don't call method on mock but on some other object.
at com.bitcoin.BitcoinPricerTest.testMock(BitcoinPricerTest.java:46)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at junitparams.JUnitParamsRunner.runChild(JUnitParamsRunner.java:416)
at junitparams.JUnitParamsRunner.runChild(JUnitParamsRunner.java:385)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
BitCoinPricer类的代码

package com.bitcoin;

public class BitCoinPricer {

    static BitCoinValueService b = new BitCoinValueService();    

    public BitCoinPricer(BitCoinValueService b){
        this.b = b; 
    }

    public static  double convertEuro (double result){

        double euroVal = 1.227481; 

        result = b.findPrice() * euroVal;

        return result;

    }

}
BitCoinValueService的伪代码:

findprice(){
    double result; 
    // do this

    return double result; 
}
我试着通过这样一个数据提供者来接近它:

@DataProvider
public List<Object[]> dp(){
    final List<Object[]> result = new ArrayList<>();
    result.add( new Object[] {6000.00} );
    return result; 
}

@Test 
@UseDataProvider("dp")
public void testMock (double expectedVal) throws Exception{

    when(mockService.findPrice()).thenReturn(expectedVal);

    // Instantiate the object
    bcp = new BitCoinPricer (mockService);


    //Test begins 
    bcp.convertEuro(0);

    //checking condition
    assertEquals(bcp.convertEuro(expectedVal), 6000.00,0.1);

    verify(mockService, times(1)).findPrice();
}
@DataProvider
公共列表dp(){
最终列表结果=新建ArrayList();
添加(新对象[]{6000.00});
返回结果;
}
@试验
@UseDataProvider(“dp”)
public void testMock(double expectedVal)引发异常{
when(mockService.findPrice()),然后return(expectedVal);
//实例化对象
bcp=新比特币定价器(模拟服务);
//考试开始了
bcp.欧元(0);
//检查条件
资产质量(bcp.换算欧元(预期价值),6000.00,0.1);
验证(mockService,次(1)).findPrice();
}
但是,我得到了一个参数太多的异常


为什么我总是得到这种误用方法调用?我把价格定为6000.00美元。因此,我可以围绕它构建我的Junit测试。任何帮助都将不胜感激

除非这是原始问题中的输入错误,否则测试中的系统需要重构

public class BitCoinPricer {
    BitCoinValueService valueService;

    public BitCoinPricer(BitCoinValueService valueService){
        this.valueService = valueService; 
    }

    public double convertEuro (){
        double euroVal = 1.227481; 
        double result = valueService.findPrice() * euroVal;
        return result;
    }
}
然后,测试可能看起来像

@RunWith(JUnitParamsRunner.class)
public class BitcoinPricerTest {
    @Before
    public void initMocks(){
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testMock (){
        //Arrange
        double price = 6000.00;
        double expected = price * 1.227481;
        BitCoinValueService bsp = Mockito.mock(BitCoinValueService.class);
        Mockito.when(bsp.findPrice()).thenReturn(price);
        BitCoinPricer bp = new BitCoinPricer(bsp);

        //Act
        double actual = bp.convertEuro();

        //Assert
        assertEquals(expected, actual, 1.0);
        Mockito.verify(bsp).findPrice();
    }
}

调用时,模拟被安排为按预期运行,并且可以进行断言以验证测试中的方法是否按预期运行。

在您的情况下,最好在
@BeforeClass
中使用
Mockito.mock(BitCoinValueService.class)
创建一个模拟,并在
@之后重置它。我假定您的模拟没有正确启动。

删除
静态
。为什么构造函数param需要static关键字?@utkusonmez BitCoinPricer类的converEuro()方法中使用了b.findPrice()。了解,但不需要是静态的。使其成为本地字段。而且也不需要将方法设置为静态well@Nkosi谢谢,我删除了静态关键字。但是,我的断言显示的是实际值,而不是6000。@utkusonmez我删除了static关键字。但是,我的assertEquals实时比较实际值,不使用6000.00值?