Не умеет издеваться над синглтон-классом с мокито / powermock - PullRequest
0 голосов
/ 08 февраля 2019
<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-api-mockito</artifactId>
  <version>1.4.12</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-module-junit4</artifactId>
  <version>1.4.12</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.junit.jupiter</groupId>
  <artifactId>junit-jupiter-api</artifactId>
  <version>5.2.0</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.junit.jupiter</groupId>
  <artifactId>junit-jupiter-engine</artifactId>
  <version>5.2.0</version>
  <scope>test</scope>
</dependency>

Я пытаюсь создать макет для одноэлементного перечисления на Java в моем коде Scala, взяв ссылку из здесь и здесь .Я не могу изменить этот синглтон, так как он поступает из какой-то другой библиотеки, некоторый код этого синглтона выглядит следующим образом:

public enum singleton implements Isingleton {
    INSTANCE;

    public Command getCommand(String name) {  <-- method to be mocked
        ....
    }
   ....
}

Ниже приведена часть кода, но я получаю ошибку:

@RunWith(classOf[PowerMockRunner])
@PrepareForTest(Array(classOf[mySingleTon]))
class myTest  {

  @Test
  def test(): Unit = {
    val mockInstance = org.mockito.Mockito.mock[mySingleTon]  //val mockInstance = org.powermock.api.mockito.PowerMockito.mock(classOf[mySingleTon])
    Whitebox.setInternalState(classOf[mySingleTon], "INSTANCE":String, mockInstance:Any)
    when(mockInstance.getAerospikeCommand(nameCapture.capture())).thenReturn(mockedFunc)

Ошибка:

org.mockito.exceptions.base.MockitoException: 
Cannot mock/spy class com.my.cap.myModule.Singleton
Mockito cannot mock/spy following:
  - final classes
  - anonymous classes
  - primitive types

    at org.scalatest.mock.MockitoSugar$class.mock(MockitoSugar.scala:74)

Я также попытался выполнить следующее, как предлагалось здесь :

@RunWith(classOf[PowerMockRunner])
@PrepareForTest(Array(classOf[mySingleTon]))
class myTest  {

  @Test
  def test(): Unit = {
     import org.powermock.api.mockito.PowerMockito
     PowerMockito.mockStatic(classOf[mySingleTon])
     BDDMockito.given(mySingleTon.INSTANCE.getCommand(nameCapture.capture())).willReturn(mockedCommand)

, но затем я начал получать следующую ошибку:

java.lang.IllegalArgumentException: Cannot subclass final class class com.cap.myModule.mySingleTon

    at org.mockito.cglib.proxy.Enhancer.generateClass(Enhancer.java:447)
    at org.mockito.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
    at org.mockito.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:217)
    at org.mockito.cglib.proxy.Enhancer.createHelper(Enhancer.java:378)
    at org.mockito.cglib.proxy.Enhancer.createClass(Enhancer.java:318)
...