#java #testing #exception #junit #throw
#java #тестирование #исключение #junit #бросать
Вопрос:
У меня есть public void method
определенное throws
условие, которое Exception
if
выполняется. В моем случае метод выглядит следующим образом:
public void toBeTestedMethod(Testobject testObject) throws CertainException {
if (testObject.getStatus().getAllowsEdit()){
throw ...}
}
getStatus()
это метод, который возвращает определенный статус и getAllowsEdit()
является методом, который возвращает boolean
значение и nullable = true
. Для этих двух методов также существуют set-методы.
Edit1: тест, касающийся этого метода, когда он завершается с ошибкой, уже выполняется нормально:
public void testToBeTestedMethod_FailureStatus() throws Exception {
try {
TestObject testObject = _testObjectMockDAO.getNewTestObject();
_testObjectMockDAO.setTestObject(testObject);
_testObjectBusinessImpl.toBeTestedMethod(testObject);
fail("Check failed");
} catch (CertainException ex) {
assertEquals(ErrorCode.WRONG_STATUS, ex.getErrorCode());
}
}
Теперь я хотел бы протестировать метод toBeTestedMethod
. Цель состоит в том, чтобы метод не создавал исключение, а выполнялся успешно.
Это означает, что я хотел бы написать JUNIT-test, который проверяет следующее:
public void testToBeTestedMethod_success throws Exception{
// Enter test code here
}
Edit2 (относительно class Status
):
public class Status {
...
private String _status;
public String getStatus() {
return _status;
}
}
На мой взгляд, я должен изменить условие в if-инструкции, чтобы получить ожидаемый результат, правильно?
Примечание: я не писал метод и другой код. Тем не менее, моя задача — протестировать код через JUNIT. Я пробовал некоторый код, но каждый раз я получаю сообщение об ошибке, что исключение было выдано.
Даже если вы не можете решить эту проблему, я был бы рад получить несколько подсказок, где мне следует искать проблему, почему мой тест не выполняет то, что я хочу, чтобы тест выполнял.
Комментарии:
1. можете ли вы показать, что такое GetStatus и как выглядит определение класса
Ответ №1:
Ваш вопрос очень абстрактный и требует больше данных, я публикую здесь ответ, основанный на том, что я понял. Вот классы:
public class SampleTestService {
public boolean toBeTestedMethod(TestObject testObject) throws AccessViolationException {
if (testObject.getStatus().getAllowsEdit()) {
throw new AccessViolationException("Edit is allowed for this non confirmed user");
} else {
return true;
}
}
static class TestObject {
private SomeStatus someStatus;
public SomeStatus getStatus() {
return someStatus;
}
}
static class SomeStatus {
private boolean allowsEdit;
public boolean getAllowsEdit() {
return allowsEdit;
}
}
static class AccessViolationException extends RuntimeException {
public AccessViolationException(String message) {
super(message);
}
}
}
Поскольку метод зависит от другого класса, а этот класс зависит также от другого класса, вам нужно издеваться над ними в цепочке. Вот как я это сделал:
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@ExtendWith(SpringExtension.class)
class SampleTestServiceTest {
private final SampleTestService.TestObject mockTestObject = mock(SampleTestService.TestObject.class);
private final SampleTestService.SomeStatus mockSomeStatus = mock(SampleTestService.SomeStatus.class);
private final SampleTestService service = new SampleTestService();
@Test
void testThatMethodDoesNotThrowsException() {
when(mockTestObject.getStatus()).thenReturn(mockSomeStatus);
when(mockSomeStatus.getAllowsEdit()).thenReturn(false);
boolean result = service.toBeTestedMethod(mockTestObject);
Assertions.assertTrue(result);
}
@Test
void testThatMethodThrowsException() {
when(mockTestObject.getStatus()).thenReturn(mockSomeStatus);
when(mockSomeStatus.getAllowsEdit()).thenReturn(true);
Assertions.assertThrows(SampleTestService.AccessViolationException.class, () -> {
service.toBeTestedMethod(mockTestObject);
});
}
}
Комментарии:
1. Спасибо за ваш ответ! Я думаю, что это идет в правильном направлении. Я отредактирую свой вопрос с помощью тестового примера, в котором он выдает исключение. Это уже работает. И я также пытаюсь ответить на вопрос, который вы подняли относительно класса Status и GetStatus()-метода.