嘿,我有一个关于 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 中的断言和模拟的问题的主要内容,如果未能解决你的问题,请参考以下文章