我想模擬從我的類的建構式呼叫的靜態方法。
我的課:
package com.javaeasily.demos.junit;
import java.util.ArrayList;
public class MyClass {
private int number;
private static final ArrayList<String> ACTIVE_SERVICES_POST_RECONFIGURE = new ArrayList<>();
// Only allow construction if number is greater than one
MyClass() {
ACTIVE_SERVICES_POST_RECONFIGURE.add("my-node-" NodeUtils.getMyNode());
}
public void reconfigureNode() {
if (ACTIVE_SERVICES_POST_RECONFIGURE.isEmpty()) {
return;
}
}
}
這里 NodeUtils.getMyNode() 是從類的建構式呼叫的靜態方法。
NodeUtils.java 類:
package com.javaeasily.demos.junit;
import org.apache.maven.surefire.shade.booter.org.apache.commons.lang3.StringUtils;
public class NodeUtils {
private static final String HOSTNAME_PREFIX = "my-node-";
public static String hostnameToNode(String hostname) {
if (!hostname.startsWith(HOSTNAME_PREFIX)) {
throw new IllegalArgumentException(hostname " is not recognized hostname");
}
return StringUtils.removeStart(hostname, HOSTNAME_PREFIX);
}
public static String getHostname() {
return System.getenv("HOSTNAME");
}
public static String getMyNode() {
return hostnameToNode(getHostname());
}
}
MyClassTest.java
package com.javaeasily.demos.junit;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class MyClassTest {
private MyClass myclass;
@BeforeEach
public void SetUp() {
myclass = new MyClass();
}
@Test
public void testReconfigureNode() {
myclass.reconfigureNode();
}
}
當我嘗試運行唯一的測驗用例時,出現以下錯誤:
java.lang.NullPointerException
at com.javaeasily.demos.junit.NodeUtils.hostnameToNode(NodeUtils.java:8)
at com.javaeasily.demos.junit.NodeUtils.getMyNode(NodeUtils.java:19)
at com.javaeasily.demos.junit.MyClass.<init>(MyClass.java:12)
at com.javaeasily.demos.junit.MyClassTest.SetUp(MyClassTest.java:11)
我不確定我們如何模擬該方法以避免此錯誤?
由于我是 Java 新手,所以我無法理解這一點。任何幫助在這里表示贊賞。
uj5u.com熱心網友回復:
因此,要回答您的問題如何模擬靜態方法:mockito 從 3.8.0 版開始允許這樣做。您可以在 Baeldung找到教程
這允許為具體背景關系生成靜態模擬物件,您可以在 try 塊中創建該物件。對于您的情況,這將如下所示。
固定單元測驗
package com.javaeasily.demos.junit;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.MockedStatic;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
public class MyClassTest {
private MyClass myclass;
@BeforeEach
public void SetUp() {
try (MockedStatic<NodeUtils> nodeUtilsMockedStatic = Mockito.mockStatic(NodeUtils.class)) {
nodeUtilsMockedStatic.when(NodeUtils::getMyNode).thenReturn("foo");
myclass = new MyClass();
}
}
@Test
public void testReconfigureNode() {
myclass.reconfigureNode();
}
}
Mockito 依賴
您的專案中至少需要具有 3.8.0 版本的 mockito。
使用 Maven 添加:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>3.8.0</version>
<scope>test</scope>
</dependency>
使用 gradle 添加:
testImplementation group: 'org.mockito', name: 'mockito-inline', version: '3.8.0'
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/491796.html
