0Pricing
Testing Mastery: JUnit, Mockito & Integration Tests · 강의

반환 값 스터빙

메서드가 호출될 때 목 객체가 특정 값을 반환하거나 예외를 발생시키도록 구성합니다.

반환 값 스터빙은(는) CoddyKit의 무료 Testing Mastery: JUnit, Mockito & Integration Tests 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Testing Mastery: JUnit, Mockito & Integration Tests 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Testing Mastery: JUnit, Mockito & Integration Tests 강의에는 총 4개의 강의가 포함되어 있습니다.

이 강의의 일부는 아직 번역되지 않았으며 영어로 표시됩니다.

Intro to Stubbing Mocks

When you create a mock object, it doesn't have any real behavior. Its methods do nothing by default, often returning null, 0, or empty collections.

Stubbing is the process of teaching a mock object how to respond to specific method calls. It's like giving your mock a script to follow!

This allows you to control the exact conditions for your tests, isolating the code you're actually testing.

Making Mocks Return Values

The most common way to stub a mock is using when().thenReturn(). This tells Mockito: "When this specific method is called on the mock, return this predefined value."

  • when(mock.someMethod()).thenReturn(value);

The value can be any object or primitive type that matches the method's return type.

thenReturn() Code Example

Try running this simple example. Notice how the mock's add method returns our stubbed value only when called with (1, 1).

import static org.mockito.Mockito.*;

interface CalculatorService {
    int add(int a, int b);
}

public class Main {
    public static void main(String[] args) {
        // Create a mock of CalculatorService
        CalculatorService mockCalc = mock(CalculatorService.class);

        // Stub the add(1, 1) method to return 5
        when(mockCalc.add(1, 1)).thenReturn(5);

        // Call the stubbed method
        System.out.println("1 + 1 = " + mockCalc.add(1, 1));

        // Call a method that was NOT stubbed
        System.out.println("2 + 2 = " + mockCalc.add(2, 2));
    }
}

Mocks Throwing Errors

Sometimes you need to test how your code handles errors. You can configure a mock to throw an exception when a specific method is called, using when().thenThrow().

  • when(mock.failingMethod()).thenThrow(new SomeException("Error!"));

This is crucial for testing error paths and ensuring your application gracefully handles unexpected situations.

thenThrow() Code Demo

In this example, our DataService mock is configured to throw an IllegalArgumentException if we try to fetch data with an "invalid" ID.

import static org.mockito.Mockito.*;

interface DataService {
    String fetchData(String id);
}

public class Main {
    public static void main(String[] args) {
        DataService mockData = mock(DataService.class);

        // Stub fetchData("invalid") to throw an exception
        when(mockData.fetchData("invalid"))
            .thenThrow(new IllegalArgumentException("ID not found!"));

        // Call a method that was NOT stubbed (returns null by default)
        System.out.println("Fetching 'valid': " + mockData.fetchData("valid"));

        // Call the stubbed method that throws an exception
        try {
            System.out.println("Fetching 'invalid': " + mockData.fetchData("invalid"));
        } catch (IllegalArgumentException e) {
            System.out.println("Caught error: " + e.getMessage());
        }
    }
}

Dynamic Responses: thenAnswer()

What if you need the mock's response to depend on the arguments passed to it, or to perform some custom logic?

when().thenAnswer() is your solution. It takes an Answer object (often a lambda or anonymous class) which provides more control:

  • You get access to the actual method arguments.
  • You can perform calculations or complex logic.
  • You can return a value or throw an exception dynamically.

thenAnswer() Code Demo

Here, the multiply method on our mock actually performs the multiplication based on the arguments it receives. This is more dynamic than a fixed return value.

import static org.mockito.Mockito.*;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;

interface MathService {
    int multiply(int a, int b);
}

public class Main {
    public static void main(String[] args) {
        MathService mockMath = mock(MathService.class);

        // Stub multiply for any two integers to perform actual multiplication
        when(mockMath.multiply(anyInt(), anyInt())).thenAnswer(
            new Answer<Integer>() {
                public Integer answer(InvocationOnMock invocation) {
                    Object[] args = invocation.getArguments();
                    Integer arg1 = (Integer) args[0];
                    Integer arg2 = (Integer) args[1];
                    return arg1 * arg2; // Custom logic based on arguments
                }
            }
        );

        System.out.println("3 * 4 = " + mockMath.multiply(3, 4));
        System.out.println("5 * 2 = " + mockMath.multiply(5, 2));
        System.out.println("7 * 0 = " + mockMath.multiply(7, 0));
    }
}

Multiple Returns: Chaining

What if you want a mock method to return different values on successive calls?

Mockito allows you to chain stubbing methods. You can provide multiple return values to thenReturn(), or chain multiple thenReturn(), thenThrow(), or thenAnswer() calls.

  • when(mock.method()).thenReturn(val1, val2, val3);
  • when(mock.method()).thenReturn(val1).thenThrow(ex).thenReturn(val3);

After all specified values or actions are exhausted, the last one will be repeated for subsequent calls.

Chained Stubbing Demo

Observe how our mock Queue returns "Item A", then "Item B", and then throws an exception on subsequent poll() calls.

import static org.mockito.Mockito.*;
import java.util.Queue;
import java.util.LinkedList;

public class Main {
    public static void main(String[] args) {
        Queue<String> mockQueue = mock(Queue.class);

        // Stub poll() to return different values/actions on successive calls
        when(mockQueue.poll())
            .thenReturn("Item A")
            .thenReturn("Item B")
            .thenThrow(new IllegalStateException("Queue is empty!"));

        System.out.println("Poll 1: " + mockQueue.poll()); // Returns "Item A"
        System.out.println("Poll 2: " + mockQueue.poll()); // Returns "Item B"

        try {
            System.out.println("Poll 3: " + mockQueue.poll()); // Throws exception
        } catch (IllegalStateException e) {
            System.out.println("Caught error on Poll 3: " + e.getMessage());
        }

        // Subsequent calls will repeat the last action (throw exception)
        try {
            System.out.println("Poll 4: " + mockQueue.poll());
        } catch (IllegalStateException e) {
            System.out.println("Caught error on Poll 4: " + e.getMessage());
        }
    }
}

Check Your Understanding

You are testing a method that processes items from a queue. You need the queue's poll() method to return "Task 1", then "Task 2", and finally null (indicating an empty queue) for subsequent calls. Which Mockito stubbing approach would you use?

Stubbing Return Values: Recap

In this lesson, you learned how to control the behavior of your mock objects by stubbing their method calls. This is fundamental for isolating the unit under test and creating predictable test environments.

  • when().thenReturn(): To make a mock method return a specific value.
  • when().thenThrow(): To make a mock method throw an exception.
  • when().thenAnswer(): For dynamic responses based on method arguments or custom logic.
  • Chaining: To define a sequence of different behaviors for successive calls to the same method.

Next, we'll explore Mockito's argument matchers for even more flexible stubbing and verification!

자주 묻는 질문

“반환 값 스터빙” 강의는 무료인가요?

네 — “반환 값 스터빙” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Testing Mastery: JUnit, Mockito & Integration Tests 강의 전체를 잠금 해제할 수 있습니다. Testing Mastery: JUnit, Mockito & Integration Tests 강의에는 총 4개의 강의가 포함되어 있습니다.

“반환 값 스터빙”에서 뭘 배우나요?

메서드가 호출될 때 목 객체가 특정 값을 반환하거나 예외를 발생시키도록 구성합니다. 브라우저에서 직접 실행하는 실습 코드로 Testing Mastery: JUnit, Mockito & Integration Tests을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Testing Mastery: JUnit, Mockito & Integration Tests을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Testing Mastery: JUnit, Mockito & Integration Tests은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“반환 값 스터빙” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Testing Mastery: JUnit, Mockito & Integration Tests 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Testing Mastery: JUnit, Mockito & Integration Tests 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 반환 값 스터빙
  2. Mockito 인수 매처
  3. 실제 객체 감시하기
  4. 예외 발생과 연속 호출
← Testing Mastery: JUnit, Mockito & Integration Tests(으)로 돌아가기