大家好。有这个类:
public class Class_A {
public String method1(String str1){
try {
return Class_B.calc(str1);
} catch (Exception e) {
// вот здесь e.getMessage() = "Ошибка сервиса"
throw new MyException(e.getMessage(), e);
}
}
public boolean method2(String str1, String str2){
return method1(str1).equals(str2);
}
public void throwMyExceptionIfNoUser(String str1, String str2) throw MyException {
if (!method2(st1, str2)) {
throw new MyException(String.format("Отсутвует пользователь %s", str1));
}
}
}
有这个测试:
@ExtendWith(MockitoExtension.class)
@RunWith(JUnitPlatform.class) //@MockitoSettings(strictness = Strictness.LENIENT)
类 Class_ATest {
@org.junit.jupiter.api.BeforeEach
void setUp() {
}
@org.junit.jupiter.api.AfterEach
void tearDown() {
}
/**
* этот тест возвращает вот это
*
* java.lang.NullPointerException
* at ua.avk.junit.Class_A.method1(Class_A.java:9)
*
*/
@org.junit.jupiter.api.Test
void throwMyExceptionIfNoUser_v1() {
String str1 = "str1";
String str2 = "str2";
Class_A classA = Mockito.spy(new Class_A());
Assertions.assertNotNull(classA);
Mockito.when(classA.method2(str1, str2)).thenReturn(false);
//Mockito.doReturn(false).when(classA).method2(str1, str2);
MyException myException = Assertions.assertThrows(
MyException.class,
() -> { throw new MyException(String.format("Отсутвует пользователь %s", str2)); }
);
//Mockito.verify(classA).hasRole(str1, str2);
//String exp = String.format("Ошибка сервиса Отсутвует пользователь %s", str2);
String exp = String.format("Отсутвует пользователь %s", str2);
String act = myException.getMessage();
Assertions.assertEquals(exp, act);
}
/**
* этот тест возвращает вот это
*
*
* Wanted but not invoked:
* classA.method2(
* "str1",
* "str2"
* );
* -> at ua.avk.junit.Class_ATest.throwMyExceptionIfNoUser_v2(Class_ATest.java:73)
* Actually, there were zero interactions with this mock.
*
* Но если убрать проверку Mockito.verify то он возвращвет "Ошибка сервисa Отсутвует пользователь %s", str2"
* Получается что он не мокает method2
*/
@org.junit.jupiter.api.Test
void throwMyExceptionIfNoUser_v2() {
String str1 = "str1";
String str2 = "str2";
Class_A classA = Mockito.mock(Class_A.class);
Assertions.assertNotNull(classA);
Mockito.when(classA.method2(str1, str2)).thenReturn(false);
MyException myException = Assertions.assertThrows(
MyException.class,
() -> { throw new MyException(String.format("Отсутвует пользователь %s", str2)); }
);
Mockito.verify(classA).hasRole(str1, str2);
//String exp = String.format("Ошибка сервисa Отсутвует пользователь %s", str2);
String exp = String.format("Отсутвует пользователь %s", str2);
String act = myException.getMessage();
Assertions.assertEquals(exp, act);
}
}
我使用这些依赖项:
<jupiter.version>5.7.0</jupiter.version>
<junit-platform.version>1.7.2</junit-platform.version>
<mockito.jupiter.version>3.7.7</mockito.jupiter.version>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${jupiter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>${jupiter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${jupiter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-runner</artifactId>
<version>${junit-platform.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>${mockito.jupiter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>${mockito.jupiter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<version>2.0.9</version>
<scope>test</scope>
</dependency>
测试结果在测试的注释中给出。 事实证明,mockito 没有模拟任何东西!?为什么???或者,也许,我没有正确理解模拟如何工作的技术???
请帮我解决模拟问题,我已经铲了一堆码头(在stackOverflow上->也是),但是,不幸的是,我没有找到一个可理解的答案......提前谢谢你的回答。