当前位置: 首页 > 知识库问答 >
问题:

@RunWith测试用例运行良好,一旦我使用@ExtendWith进行更改,它就会开始提供空指针

锺离俊雄
2023-03-14

我正在编写JUnit测试用例,在开始只是我写了@Runwith(MockitoJUnitRunner.class),它工作正常。

后来我用@ExtendWith(MockitoExtension.class)进行了更改,它开始给出空指针,我不明白为什么会这样。这里怎么了。

基本代码: ----------------

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;

@Component
public class IdpsDecryptorImpl implements IdpsDecryptor {

    @Value("${idps.key}")
    private String idpsKey;

    @Autowired
    private IdpsClient idpsClient;

    private Key retrieveKey() {
        return idpsClient.newKeyHandleLatest(idpsKey);
    }

    public String decrypt(byte[] encryptedBytes) {
        byte[] decryptedBytes;
        Key keyHandle = retrieveKey();
        try {
            decryptedBytes = keyHandle.deriveTwiceAndDecryptLocal(encryptedBytes);
        } catch (IdpsException | IdpsCommunicationException ex) {
            throw new StorageException(ErrorCode.IDPS_DECRYPT_ERROR, ex.getMessage());
        }
        return new String(decryptedBytes, StandardCharsets.UTF_8);
    }
}

   
------------------
Test case:


import junit.framework.TestCase;
import org.junit.Assert;
import org.junit.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.test.util.ReflectionTestUtils;


/**
 * @author : sprasad13
 * @created : 11/07/22, Monday
 **/

@ExtendWith(MockitoExtension.class)
//@RunWith(MockitoJUnitRunner.class)
public class IdpsDecryptorImplTest extends TestCase {

    @InjectMocks
    private IdpsDecryptorImpl idpsDecryptorimpl;
    //@Mock
    Key key;

    @Mock
    IdpsClient idpsClient;

    private String idpsKey = "testKey";

    @Test
    public void testDecrypt() throws IdpsCommunicationException, IdpsException {
        ReflectionTestUtils.setField(idpsDecryptorimpl,"key",key);
        byte[] encryptedBytes = new byte[2];
        encryptedBytes[0] = 20;
        encryptedBytes[1] = 30;

        byte[] decryptedBytes = new byte[2];
        decryptedBytes[0] = 97;
        decryptedBytes[1] = 98;

        Mockito.when(idpsClient.newKeyHandleLatest(idpsKey)).thenReturn(key);
        Mockito.when(key.deriveTwiceAndDecryptLocal(encryptedBytes)).thenReturn(decryptedBytes);

        Assert.assertNotNull(idpsDecryptorimpl.decrypt(encryptedBytes));

    }

    @Test(expected = StorageException.class)
    public void testDecryptException() throws IdpsCommunicationException, IdpsException {
        byte[] encryptedBytes = new byte[1];
        encryptedBytes[0] = 20;

        byte[] decryptedBytes = new byte[1];
        decryptedBytes[0] = 97;

        Mockito.when(idpsClient.newKeyHandleLatest(idpsKey)).thenReturn(key);
        Mockito.when(key.deriveTwiceAndDecryptLocal(encryptedBytes)).thenThrow(new IdpsException());
        String result = idpsDecryptorimpl.decrypt(encryptedBytes);
        Assert.assertNull(result);
    }
}

共有1个答案

赫连俊雄
2023-03-14

它依赖于JUnit版本。

已经提出的问题:何时使用@RunWith,何时使用@ExtendWith

和标记的解决方案:

答案可在文档中找到:

如果您使用的是JUnit 4,请不要忘记将@Runwith(SpringRunner.class)添加到您的测试中,否则注释将被忽略。如果您使用的是JUnit 5,则无需将等效的@Exantwith(SpringExtension.class)添加为@SpringBootTest和其他@...测试注释已经用它进行了注释

 类似资料:
  • 我正在尝试使用visual studio for mac在我的物理IOS设备(iPhone 7)上调试我的Xamarin Forms项目,它第一次运行良好,但一旦我更改代码并在模拟器上调试,我就无法再在我的物理设备上调试;我没有这个问题,当我改变我的代码和调试再次,只要我是在我的iPhone第一次调试。 一旦发生这种情况,我会得到以下错误: 错误1:无法协同设计“bin/iphone/debug/

  • 我想用Selenium和TestNG来模拟谷歌搜索,同时使用各种搜索参数。下面是我的测试类和testng。xml。我已经使用下面的注释

  • 我试图让我的硒测试在詹金斯运行,但面临以下问题。当使用maven test或intellij运行时,测试在我的本地计算机上运行得很好。 Firefox 39 x64 Selenium 2.46.0 SeleniumHQ插件(自动更新,所以应该是最新版本) 根据这个Xvfb服务器应该正在运行 问题出在哪里?我在网上搜索了两天,尝试了几乎所有我找到的东西后,我想不出来了。 资料来源: 错误:

  • 我正在做一个SoapUI项目,我需要使用测试运行器运行我的测试套件。我正在为环境变量使用外部groovy脚本。我在这里面临的问题是,每当我从测试运行程序运行测试用例时,它的返回工作空间为空,这在Externalgroovy中使用。所以在外部groovy中,我将工作区设置为null,导致错误[getProjectByname()无法在null上调用]。下面是 使用工作空间的全局脚本的构造函数 上面我

  • 我的maven项目有一些问题。我在我的maven文件夹src/test/java中创建了一些JUnit测试。 如果我在命令行或Eclipse IDE中使用“mvn清理安装”创建了我的maven项目,并使用“清理”和“安装”等运行配置,所有测试都将正常运行,不会发生一些错误。 但是,如果我手动运行 JUnit 测试,其中一个 Junit 测试将失败。但是什么原因,为什么maven没有意识到这个事实呢

  • 我有一个类(A),它包含另一个类(B)的自动生成依赖项,而另一个类(B)又具有另一个类C的自动生成依赖项。 我正在尝试使用Mockito编写测试用例,并对依赖项使用spy注释。我在监视C类时遇到空指针错误。 如何从A类执行此单元测试?