java JUnit 5和模拟assertThrows()引发NullPointerException而不是原始异常

zyfwsgd6  于 2023-02-20  发布在  Java
关注(0)|答案(1)|浏览(130)

我想测试一个抛出MyCustomException类型异常的方法,这是我的类MyService的一个例子。

public class MyService {
    public void invoke(InvocationContext ctx) throws MyCustomException{
        if(ctx == null) {
            throw new MyCustomException("Parameter ctx must not be null.");
        }
    }
}

我想测试,如果我用assertThrows()传递一个空值,方法是否抛出MyCustomException

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mockito;
import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class)
public class AxwApplicationTest {
    @Spy
    @InjectMocks
    MyService myServiceToTest;

    @Test
    public void invoke_ShouldThrow_MyCustomException() {
        assertThrows(MyCustomException.class, () -> {
            myServiceToTest.invoke(null);
        });
    }
}

这个异常被抛出了,但最终是NullPointerException,我不知道如何解决它。assertThrows给出了以下错误:

java.lang.AssertionError: unexpected exception type thrown; expected:<com.myproject.MyCustomException> but was:<java.lang.NullPointerException>

Maven依赖项:

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.9.2</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>4.0.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-junit-jupiter</artifactId>
    <version>4.0.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-inline</artifactId>
    <version>4.0.0</version>
    <scope>test</scope>
</dependency>
nimxete2

nimxete21#

问题出在@InjectMocks@Spy注解上。2同时使用它们没有意义(如stackoverflow帖子中所讨论的)。3手工创建类解决了NullPointerException问题,测试运行成功

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mockito;
import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoExtension;

import static 
org.junit.jupiter.api.Assertions.assertThrows;

@ExtendWith(MockitoExtension.class)
public class MyServiceTest {
   MyService myServiceToTest;

   @Test
   public void invoke_ShouldThrow_MyCustomException() {
      MyService myServiceToTest = new MyService();
      assertThrows(MyCustomException.class, () -> {
        myServiceToTest.invoke(null);
      });
   }
}

相关问题