общедоступный метод void выдает исключение, если — JUNIT test: исключение не должно создаваться

#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()-метода.