when()需要一个参数,该参数必须是“模拟调用方法”

问题描述 投票:-1回答:1

我有要通过Mockito和PowerMock进行测试的此类:

public class CoolObject {
  private int myPrivateCode = 115;

  public String getSaltedUrl(String url) {
    return String.format("%s?salt=%d", url, getSalt());
  }

  private long getSalt() {
    return System.currentTimeMillis() * myPrivateCode;
  }
}

我编写了此测试,该测试试图模拟私有getSalt方法以始终返回10

import static org.powermock.api.mockito.PowerMockito.spy;
import static org.powermock.api.mockito.PowerMockito.when;

import static org.testng.Assert.*;
import org.testng.annotations.Test;

class CoolObjectTest {

  @Test
  public void testSalt() throws Exception {
    CoolObject obj = spy(new CoolObject());
    when(
      obj,
      "getSalt"
    ).thenReturn(10);

    assertEquals(obj.getSaltedUrl("https://www.google.com/"), "https://www.google.com/?salt=10");
  }
}

我得到的输出是这个:

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);

我正在使用Java8和这些依赖项进行测试:

<dependency>
  <groupId>org.testng</groupId>
  <artifactId>testng</artifactId>
  <version>7.0.0</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-core</artifactId>
  <version>2.28.2</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-api-mockito2</artifactId>
  <version>2.0.4</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-module-testng</artifactId>
  <version>2.0.4</version>
  <scope>test</scope>
</dependency>

除了使用TestNG代替JUnit之外,我正在使用的代码似乎与here所示的代码兼容。

我想念什么?

java unit-testing mockito testng powermock
1个回答
0
投票

您缺少ObjectFactoryTestNG定义,有关更多详细信息,请检查wiki

也要返回int而不是long

import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.testng.Assert;
import org.testng.IObjectFactory;
import org.testng.annotations.ObjectFactory;
import org.testng.annotations.Test;

@PrepareForTest(CoolObject.class)
public class CoolObjectTest {

    @ObjectFactory
    public IObjectFactory getObjectFactory() {
        return new org.powermock.modules.testng.PowerMockObjectFactory();
    }

    @Test
    public void testSalt() throws Exception {
        CoolObject obj = PowerMockito.spy(new CoolObject());
        PowerMockito.when(
          obj,
          "getSalt"
        ).thenReturn(10l);

       Assert.assertEquals(obj.getSaltedUrl("https://www.google.com/"), "https://www.google.com/?salt=10");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.