例如,我有以下類:
public class TesteEstatico {
public static String teste(){
return "FOO";
}
}
我有一個使用她的方法的類:
public class UsaTesteEstatico {
public String metodoParaTeste1 (){
return TesteEstatico.teste() " BAR ";
}
public String metodoParaTeste2 (){
return "FOO " TesteEstatico.teste() " BAR ";
}
}
測驗類:
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class) public class UsaTesteEstaticoTest {
@InjectMocks
UsaTesteEstatico usaTesteEstatico;
@Test
void teste1(){
Mockito.mockStatic(TesteEstatico.class);
Mockito.when(TesteEstatico.teste())
.thenReturn("BANANA");
String res = usaTesteEstatico.metodoParaTeste1();
System.out.println(res);
}
@Test
void teste2(){
Mockito.mockStatic(TesteEstatico.class);
Mockito.when(TesteEstatico.teste())
.thenReturn("LARANJA");
String res = usaTesteEstatico.metodoParaTeste2();
System.out.println(res);
}
}
嘗試運行測驗時出現錯誤:
org.mockito.exceptions.base.MockitoException:對于TesteEstatico,靜態mocking已經在當前執行緒中注冊要創建一個新的mock,必須注銷現有的靜態mock注冊
專案中的庫版本:
- junit-木星 5.5.2
- mockito-junit-jupiter 3.2.14
- 模擬行內 3.2.14
任何想法如何解決這個問題,我已經嘗試了一些東西,但沒有成功。
注意:我無法更改或添加任何新庫,因為它是一個受限專案。
uj5u.com熱心網友回復:
您應該在每個測驗中使用 try-with-resources 塊來關閉 mockStatic。
public class UsaTesteEstaticoTest {
UsaTesteEstatico usaTesteEstatico = new UsaTesteEstatico();
@Test
void teste1(){
try (var ms = Mockito.mockStatic(TesteEstatico.class)) {
Mockito.when(TesteEstatico.teste()).thenReturn("BANANA");
String res = usaTesteEstatico.metodoParaTeste1();
System.out.println(res);
}
}
@Test
void teste2(){
try (var ms = Mockito.mockStatic(TesteEstatico.class)) {
Mockito.when(TesteEstatico.teste()).thenReturn("LARANJA");
String res = usaTesteEstatico.metodoParaTeste2();
System.out.println(res);
}
}
}
@BeforeAll 中關于 mockStatic 的注意事項
使用@BeforeAll是一個陷阱和糟糕的建議。您應該努力進行互不影響的獨立測驗。這不是@BeforeAll 中呼叫的 mockStatic 的情況,因為測驗方法的存根比測驗方法更有效。
例如
// BAD CODE DONT USE
public class UsaTesteEstaticoTest {
UsaTesteEstatico usaTesteEstatico = new UsaTesteEstatico();
static MockedStatic<TesteEstatico> ms;
@BeforeAll
public static void init() {
ms = Mockito.mockStatic(TesteEstatico.class);
}
@AfterAll
public static void close() {
ms.close();
}
@Test
void teste1() {
Mockito.when(TesteEstatico.teste()).thenReturn("BANANA");
String res = usaTesteEstatico.metodoParaTeste1();
System.out.println(res);
}
@Test
void teste2() {
String res = usaTesteEstatico.metodoParaTeste2();
System.out.println(res);
}
}
teste2 印刷:
FOO BANANA BAR如果追趕teste1FOO null BAR如果單獨運行
這正是您想要避免的。
uj5u.com熱心網友回復:
您需要使用靜態塊來模擬它。
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
public class UsaTesteEstaticoTest {
@InjectMocks
UsaTesteEstatico usaTesteEstatico;
@BeforeAll
public static void init(){
Mockito.mockStatic(TesteEstatico.class);
}
@Test
void teste1(){
Mockito.when(TesteEstatico.teste())
.thenReturn("BANANA");
String res = usaTesteEstatico.metodoParaTeste1();
System.out.println(res);
}
@Test
void teste2(){
Mockito.when(TesteEstatico.teste())
.thenReturn("LARANJA");
String res = usaTesteEstatico.metodoParaTeste2();
System.out.println(res);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/402540.html
標籤:
