嘿,我有一个关于 java 中的断言和模拟的问题

Posted

技术标签:

【中文标题】嘿,我有一个关于 java 中的断言和模拟的问题【英文标题】:Hey, I have a question about assertions and mocking in java 【发布时间】:2022-01-06 10:48:17 【问题描述】:
import com.example.currence_exchange.Interfaces.Currency_Interface;
import com.example.currence_exchange.Interfaces.OldRates_Interface;
import com.example.currence_exchange.Interfaces.Rates_Interface;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class)
class CurrencyExchange_LogicTest 

    @Mock
    Currency_Interface currency_interface;
    @Mock
    Rates_Interface rates_interface;
    @Mock
    OldRates_Interface Oldrates_interface;
    @InjectMocks
    CurrencyExchange_Logic exchange_logic;


    @Test
    void currencyJsonTest() 
        Assertions.assertNotNull(currency_interface);
        Assertions.assertNotNull(rates_interface);
        Assertions.assertNotNull(Oldrates_interface);
        Assertions.assertNotNull(exchange_logic);

    

POM

    <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>5.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-runner</artifactId>
            <version>1.2.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
            <version>5.8.1</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.mockito/mockito-all -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>2.21.0</version>
            <scope>test</scope>
        </dependency>

java.lang.NoSuchMethodError: 'org.mockito.plugins.MockitoLogger org.mockito.internal.configuration.plugins.Plugins.getMockitoLogger()' 在 org.mockito.junit.jupiter.MockitoExtension.beforeEach(MockitoExtension.java:152) 在 org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeBeforeEachCallbacks$2(TestMethodTestDescriptor.java:163) 在 org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeBeforeMethodsOrCallbacksUntilExceptionOccurs$6(TestMethodTestDescriptor.java:199) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeBeforeMethodsOrCallbacksUntilExceptionOccurs(TestMethodTestDescriptor.java:199) 在 org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeBeforeEachCallbacks(TestMethodTestDescriptor.java:162) 在 org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:129) 在 org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) 在 org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) 在 java.base/java.util.ArrayList.forEach(ArrayList.java:1508) 在 org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) 在 org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) 在 java.base/java.util.ArrayList.forEach(ArrayList.java:1508) 在 org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) 在 org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) 在 org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) 在 org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) 在 org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) 在 org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107) 在 org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) 在 org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) 在 org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) 在 org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) 在 org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114) 在 org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86) 在 org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86) 在 org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53) 在 com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71) 在 com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33) 在 com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:221) 在 com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54) 抑制:java.lang.NullPointerException 在 org.mockito.junit.jupiter.MockitoExtension.afterEach(MockitoExtension.java:184) 在 org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeAfterEachCallbacks$12(TestMethodTestDescriptor.java:257) 在 org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeAllAfterMethodsOrCallbacks$13(TestMethodTestDescriptor.java:273) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeAllAfterMethodsOrCallbacks$14(TestMethodTestDescriptor.java:273) 在 java.base/java.util.ArrayList.forEach(ArrayList.java:1508) 在 org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeAllAfterMethodsOrCallbacks(TestMethodTestDescriptor.java:272) 在 org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeAfterEachCallbacks(TestMethodTestDescriptor.java:256) 在 org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:141) ... 45 更多

为什么会出现此错误?为什么尽管导入了 junit 断言,但我不能只写 assertNotNull(); 而必须写 Assertions.assertNotNull()?为什么我不能使用例如来自 mockito 的 when().then()(消息是无法解析“CurrencyExchange_LogicTest”中的“when”方法)。是不是因为依赖,有什么问题?

【问题讨论】:

如果你想避免包含类名,你需要静态导入。这是这里唯一的问题吗? 您需要导入 static ...Assertions.assertNotNull 才能不必使用断言。关于when()语句,能否提供调用的例子? @Kris yours 和 Nathans 的回答也有助于解决 mockito 问题,谢谢 @NathanHughes 谢谢 【参考方案1】:

NoSuchMethod 错误通常表明您的依赖项中的 jar 版本不匹配。您需要确保您的 Maven 依赖项使用受支持版本的组合,而不是随机组合。

为什么尽管导入了 junit 断言,但我不能只写 assertNotNull();但必须写 Assertions.assertNotNull()?

您需要像这样使用静态导入:

import static org.junit.Assert.assertNotNull;

为什么我不能使用例如来自 mockito 的 when().then()(消息是 Cannot resolve method 'when' in 'CurrencyExchange_LogicTest')

您需要另一个静态导入 Mockito.when() :

import static org.mockito.Mockito.when;

【讨论】:

谢谢,从 pom 中删除了一些未使用的 mockito 依赖,它成功了!

以上是关于嘿,我有一个关于 java 中的断言和模拟的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于google测试和断言输出(测试结果)的问题;当 gtest 说测试通过时,我可以相信吗?

关于断言的一些小常识

Java 单元测试如何断言(检查)控制台输出

在 Spock 中的项目列表上断言

嘿,我遇到了关于 git 和 heroku 的问题

XUnit 模拟传递和断言集合