“`plaintext 公共void方法会抛出异常 – JUNIT测试:不应抛出异常 “`

huangapple go评论145阅读模式
英文:

public void method throws Exception if - JUNIT test: Exception should not be thrown

问题

我有一个特定的public void method,如果满足条件,它会throws一个Exception。在我的情况下,这个方法看起来像这样:

public void toBeTestedMethod(Testobject testObject) throws CertainException {
    if (testObject.getStatus().getAllowsEdit()) {
        throw ...;
    }
}

getStatus()是一个返回特定状态的方法,getAllowsEdit()是一个返回boolean值的方法,而且nullable = true。这两个方法也有相应的设置方法。

编辑1:当这个方法失败时,关于这个方法的测试已经正常运行:

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测试,测试以下内容:

public void testToBeTestedMethod_success() throws Exception {
    
    // 在这里输入测试代码
    
}

编辑2(关于class Status):

public class Status {
    // ...
    private String _status;
    public String getStatus() {
        return _status;
    }
}

在我看来,我必须修改if语句中的条件以获得期望的结果,对吗?

注意:我没有编写这个方法和其他代码。尽管如此,我的任务是通过JUNIT测试代码。我尝试了一些代码,但每次都会出现异常被抛出的错误。即使您无法解决这个问题,我也很高兴得到一些提示,我应该查找为什么我的测试不按照我想要的方式运行的问题。

英文:

I have a certain public void method which throws an Exception if a condition is fulfilled.
In my case the method looks like this:

public void toBeTestedMethod(Testobject testObject) throws CertainException {
if (testObject.getStatus().getAllowsEdit()){
throw ...}
}

getStatus() is a method which returns a certain Status and getAllowsEdit() is a method which returns a boolean value and nullable = true. For the two methods there also exist set-methods.

Edit1: The test regarding this method when it fails is already running fine:

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());
        }
    }

I would now like to test the method toBeTestedMethod. The target is that the method does not throw an exception but gets executed successfully.

That means I would like to write a JUNIT-test which tests the following:

public void testToBeTestedMethod_success throws Exception{

// Enter test code here

}

Edit2 (regarding the class Status):

public class Status {
...
private String _status;
public String getStatus() {
return _status;
}
}

In my opinion, I have to modify the condition in the if-statement in order to get the expected result, correct?

Note: I did not write the method and the other code. Nevertheless, my task is to test the code via JUNIT.
I tried some code, but everytime I get the error that the Excpetion was thrown.

Even if you cannot solve this problem, I would be glad to get some hints where I should look for the problem why my test does not do what I want the test to do.

答案1

得分: 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);
        });
    }
}
英文:

Your question is very abstract and needs more data, I am posting an answer here based on what I have understood.
Here are the classes:

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);
        }
    }
}

Since the method depends on another class and that class-dependent also on another class you need to mock them in the chain. Here is how I have done it:

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);
        });

    }
}

huangapple
  • 本文由 发表于 2020年10月26日 21:08:29
  • 转载请务必保留本文链接:https://go.coder-hub.com/64537763.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定