JUnit

JUnit

Top Interview Questions

About JUnit

 

Understanding JUnit: The Foundation of Java Testing

In modern software development, testing is as critical as coding. It ensures that applications perform as intended, reduces bugs, and maintains code quality over time. For developers working with Java, one of the most essential tools for automated testing is JUnit. JUnit is a widely used framework that allows developers to write repeatable tests, validate code functionality, and adopt test-driven development (TDD) practices.

Origins and Evolution of JUnit

JUnit was created in 1997 by Kent Beck and Erich Gamma, pioneers of extreme programming (XP) and design patterns. The framework was designed to make testing simpler, more structured, and automated, introducing the concept of unit testing into everyday software development for Java applications.

Over the years, JUnit has undergone several major revisions:

  1. JUnit 3.x – The early version introduced basic unit testing concepts and required developers to extend the TestCase class.

  2. JUnit 4.x – Introduced annotations such as @Test, @Before, @After, and @Ignore, reducing boilerplate code and simplifying test setup.

  3. JUnit 5 (Jupiter) – The latest major version, modular and more extensible, separating the API for writing tests from the runtime engine, supporting advanced testing features, parameterized tests, and integration with modern build tools.

JUnit’s evolution reflects the growth of software engineering practices, emphasizing automation, modularity, and maintainable testing strategies.

What is Unit Testing?

Before diving deeper into JUnit, it is essential to understand unit testing. Unit testing refers to the practice of testing individual components or "units" of code, such as methods or classes, in isolation. These tests are meant to validate that each unit behaves as expected under various conditions.

Unit tests offer several benefits:

  • Early Bug Detection: Catching errors during development reduces downstream defects.

  • Documentation: Tests serve as living documentation of how code is expected to behave.

  • Refactoring Confidence: Developers can refactor code without fear of breaking functionality.

  • Automation: Repeated testing becomes simple, supporting continuous integration (CI) and DevOps practices.

JUnit provides a standardized framework to implement these unit tests efficiently.

Key Features of JUnit

JUnit has several powerful features that make it a staple in Java development:

  1. Annotations – Simplify test declaration and lifecycle management.

    • @Test – Marks a method as a test case.

    • @BeforeEach / @AfterEach – Methods that run before or after each test.

    • @BeforeAll / @AfterAll – Methods that run once before or after all tests in a class.

    • @Disabled – Temporarily disables a test without deleting the code.

  2. Assertions – Core to validating test outcomes. Common assertions include:

    • assertEquals(expected, actual) – Checks that two values are equal.

    • assertTrue(condition) – Checks that a condition is true.

    • assertFalse(condition) – Checks that a condition is false.

    • assertThrows(exception.class, executable) – Ensures a specific exception is thrown.

  3. Parameterized Tests – JUnit 5 allows tests to run with multiple sets of input data using @ParameterizedTest and annotations like @ValueSource, @CsvSource, and @MethodSource.

  4. Test Suites – Grouping multiple test classes to run together, providing a broader test coverage in a single execution.

  5. Integration with Build Tools – JUnit seamlessly integrates with Maven, Gradle, and Ant, allowing automated tests to run during build processes.

  6. Test Discovery – The JUnit engine automatically detects test classes and methods, making it easy to run large test suites.

JUnit Architecture

Understanding JUnit’s architecture helps in leveraging its full potential for large projects. JUnit follows a modular and layered design:

  1. JUnit Platform – Introduced in JUnit 5, it serves as the foundation, providing a common infrastructure for launching testing frameworks.

  2. JUnit Jupiter – The programming and extension model of JUnit 5, where developers write tests using annotations and modern features.

  3. JUnit Vintage – Maintains backward compatibility with JUnit 3 and JUnit 4, allowing older tests to run in the newer platform.

The modular architecture ensures flexibility and future-proofing, enabling developers to write tests with modern features while maintaining legacy test suites.

Writing Tests with JUnit

Here is a simple example demonstrating how to write unit tests with JUnit 5:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class CalculatorTest {

    @Test
    void additionShouldReturnCorrectSum() {
        Calculator calc = new Calculator();
        int result = calc.add(5, 7);
        assertEquals(12, result, "5 + 7 should equal 12");
    }

    @Test
    void divisionShouldThrowExceptionWhenDivideByZero() {
        Calculator calc = new Calculator();
        assertThrows(ArithmeticException.class, () -> calc.divide(10, 0), "Division by zero should throw ArithmeticException");
    }
}

In this example:

  • @Test identifies the test methods.

  • assertEquals validates expected outcomes.

  • assertThrows checks for exceptions.

This approach allows developers to verify individual units in isolation, improving code reliability.

Test-Driven Development (TDD) with JUnit

JUnit plays a pivotal role in Test-Driven Development (TDD), a methodology where developers write tests before the actual code. The process follows three steps:

  1. Red – Write a test that fails because the functionality does not exist yet.

  2. Green – Write minimal code to make the test pass.

  3. Refactor – Improve the code structure while ensuring tests still pass.

JUnit’s automation and feedback loop make TDD feasible, ensuring robust, clean, and well-tested code from the start.

Best Practices for Using JUnit

To get the most out of JUnit, developers should follow these best practices:

  1. Write Independent Tests – Each test should run independently of others to prevent cascading failures.

  2. Keep Tests Small – Test a single behavior or method per test for clarity.

  3. Use Descriptive Names – Name test methods to indicate the scenario being tested.

  4. Automate with CI/CD – Integrate JUnit tests into pipelines for continuous feedback.

  5. Handle Exceptions – Always validate that exceptions are thrown when expected.

  6. Avoid Logic in Tests – Test code should be simple; complex logic in tests can hide errors.

Advanced Features in JUnit

JUnit 5 introduces advanced capabilities beyond traditional unit testing:

  • Dynamic Tests – Create tests at runtime based on data or external conditions using @TestFactory.

  • Conditional Execution – Execute tests only under specific conditions using @EnabledOnOs, @EnabledOnJre, etc.

  • Custom Extensions – Extend JUnit behavior with custom extensions to manage resources, lifecycle, or logging.

These advanced features allow JUnit to adapt to complex testing scenarios, including integration testing, API testing, and even performance testing.

Integration with Other Tools

JUnit’s ecosystem extends its utility:

  • Mockito / PowerMock – For mocking dependencies in unit tests.

  • Selenium – For automated browser testing in combination with JUnit.

  • JaCoCo / Cobertura – Code coverage tools to analyze test coverage.

  • Maven / Gradle Plugins – Automate test execution during build and deployment.

By combining JUnit with these tools, developers can build fully automated, end-to-end testing pipelines.

Real-World Applications of JUnit

JUnit is used extensively in enterprise and open-source projects, including:

  • Web Applications – Testing REST APIs, service layers, and controllers.

  • Financial Systems – Ensuring the accuracy of calculations, transactions, and exception handling.

  • Enterprise Software – Validating business logic and integration between modules.

  • Open-Source Libraries – Most Java libraries include JUnit tests to verify functionality before release.

Companies adopt JUnit to enforce code quality, reduce defects, and ensure maintainability across large codebases.

Challenges and Limitations

Despite its popularity, JUnit has some limitations:

  • Not Ideal for UI Testing – It focuses on unit testing, requiring integration with tools like Selenium for front-end testing.

  • Learning Curve for Advanced Features – Annotations, extensions, and parameterized tests require some experience to use effectively.

  • Requires Java Knowledge – JUnit is Java-centric, so non-Java projects need alternative frameworks.

However, these limitations are minor compared to its advantages in automated unit testing for Java applications.

Conclusion

JUnit has transformed the way developers write, validate, and maintain Java code. From its inception in the late 1990s to the modern, modular JUnit 5, it has enabled developers to adopt automated testing and TDD, improving software quality across countless applications. Its rich set of features, seamless integration with development tools, and support for advanced testing scenarios make it an indispensable part of the Java ecosystem.

For organizations committed to code quality, reliability, and maintainability, mastering JUnit is not just an option—it is a necessity. With its powerful assertions, annotations, extensions, and modern testing capabilities, JUnit continues to empower developers to deliver robust, bug-free Java applications efficiently and confidently.

Fresher Interview Questions

 

1. Basics of JUnit

Q1. What is JUnit?
Answer:
JUnit is a Java testing framework used to write and run unit tests. It helps verify that individual units of code (methods or classes) work as expected.

Key Points:

  • Open-source and widely used in test-driven development (TDD).

  • Supports annotations, assertions, and test runners.

  • Automates testing and integrates with build tools like Maven, Gradle.


Q2. What is a Unit Test?
Answer:
A unit test verifies a single “unit” of code in isolation, typically a method or class.

  • Ensures correct behavior before integrating with other components.

  • JUnit is a common framework for unit tests in Java.


Q3. Why is JUnit used?
Answer:

  • Automates code verification.

  • Helps catch bugs early in development.

  • Enables regression testing.

  • Supports TDD methodology.


Q4. What are the versions of JUnit?
Answer:

  • JUnit 3.x: Older version, uses extends TestCase.

  • JUnit 4.x: Introduced annotations (@Test, @Before, @After).

  • JUnit 5.x (Jupiter): Modern, modular, supports Java 8+, annotations like @BeforeEach, @AfterEach.


Q5. Difference between JUnit 4 and 5
Answer:

Feature JUnit 4 JUnit 5 (Jupiter)
Annotations @Before, @After @BeforeEach, @AfterEach
Modular Monolithic Modular (Jupiter, Vintage)
Java Version Java 5+ Java 8+
Tagging N/A @Tag for categorization

2. JUnit Annotations

Q6. What is @Test?
Answer:
Marks a method as a test method. JUnit executes all methods annotated with @Test.

@Test
public void testAddition() {
    assertEquals(5, Calculator.add(2, 3));
}

Q7. What is @Before and @After?
Answer:

  • @Before: Runs before each test method. Used for setup.

  • @After: Runs after each test method. Used for cleanup.

@Before
public void setUp() { /* initialize resources */ }

@After
public void tearDown() { /* release resources */ }

Q8. Difference between @Before and @BeforeClass
Answer:

Annotation Execution Frequency
@Before Before each test method
@BeforeClass Once before all test methods

@BeforeClass must be static.


Q9. What is @Ignore?
Answer:
Skips a test method temporarily. Useful for unfinished tests.

@Ignore("Pending implementation")
@Test
public void testFeatureX() {}

Q10. What is @AfterClass?
Answer:

  • Runs once after all test methods.

  • Typically used for cleanup of resources.


Q11. What is @BeforeEach and @AfterEach in JUnit 5?
Answer:

  • @BeforeEach: Runs before each test.

  • @AfterEach: Runs after each test.

Equivalent to JUnit 4’s @Before and @After.


Q12. What is @BeforeAll and @AfterAll in JUnit 5?
Answer:

  • Runs once before/after all tests in a class.

  • Methods must be static.


Q13. What is @DisplayName?
Answer:
Allows giving custom names to tests for reporting.

@Test
@DisplayName("Test addition of two numbers")
void testAddition() {}

Q14. What is @Disabled in JUnit 5?
Answer:
Replaces @Ignore in JUnit 4. Marks test as temporarily disabled.


Q15. What is @Tag in JUnit 5?
Answer:
Used to categorize tests, useful in large projects.

@Tag("integration")
@Test
void testDatabaseConnection() {}

3. Assertions in JUnit

Q16. What is an Assertion in JUnit?
Answer:
Assertions verify expected vs actual results. If assertion fails, test fails.


Q17. Common JUnit Assertions:

  • assertEquals(expected, actual) – checks equality.

  • assertTrue(condition) – checks boolean true.

  • assertFalse(condition) – checks boolean false.

  • assertNull(object) – object is null.

  • assertNotNull(object) – object is not null.

  • assertArrayEquals(expectedArray, actualArray) – compares arrays.


Q18. Example of Assertion:

@Test
public void testMultiply() {
    int result = Calculator.multiply(2, 3);
    assertEquals(6, result);
}

Q19. Difference between assertEquals and assertSame
Answer:

  • assertEquals: Checks value equality.

  • assertSame: Checks object reference equality.


Q20. Difference between assertTrue and assumeTrue
Answer:

  • assertTrue: Fails test if condition false.

  • assumeTrue: Skips test if condition false. Useful for conditional tests.


4. Exception Testing

Q21. How to test exceptions in JUnit 4?
Answer:
Use expected attribute in @Test.

@Test(expected = ArithmeticException.class)
public void testDivideByZero() {
    Calculator.divide(5, 0);
}

Q22. How to test exceptions in JUnit 5?
Answer:
Use assertThrows():

@Test
void testDivideByZero() {
    assertThrows(ArithmeticException.class, () -> Calculator.divide(5, 0));
}

Q23. What is fail() in JUnit?
Answer:
Used to explicitly fail a test, typically for unreachable code:

@Test
void test() {
    if (conditionNotMet) {
        fail("Condition not met");
    }
}

5. Test Lifecycle & Setup

Q24. What is Test Fixture?
Answer:
A set of objects and states used as a baseline for tests. Set up using @Before or @BeforeEach.


Q25. What is Test Suite in JUnit?
Answer:
A collection of test classes executed together.

@RunWith(Suite.class)
@Suite.SuiteClasses({TestClass1.class, TestClass2.class})
public class AllTests {}

Q26. How to run a single test method in JUnit?
Answer:

  • Use IDE (Eclipse, IntelliJ) right-click → Run As → JUnit Test.

  • Use Maven: mvn test -Dtest=ClassName#methodName.


Q27. How to run JUnit tests from Maven?
Answer:
Add JUnit dependency in pom.xml and run:

mvn test

Q28. Difference between Unit Test and Integration Test
Answer:

Unit Test Integration Test
Tests single unit Tests interaction between modules
Fast Slower, involves DB/Services
Isolated Dependent on environment

6. Parameterized & Advanced Testing

Q29. What is Parameterized Test in JUnit 4?
Answer:
Run same test with multiple inputs using @RunWith(Parameterized.class).


Q30. Example of Parameterized Test in JUnit 5:

@ParameterizedTest
@ValueSource(ints = {1, 2, 3, 4})
void testEvenNumbers(int number) {
    assertTrue(number % 2 == 0);
}

Q31. Difference between @ParameterizedTest and normal @Test
Answer:

  • @Test: Single input, single execution.

  • @ParameterizedTest: Multiple inputs, multiple executions.


Q32. How to test private methods in JUnit?
Answer:

  • Prefer testing via public methods.

  • Otherwise, use Reflection API (not recommended).


Q33. What is Test-Driven Development (TDD)?
Answer:

  • Write tests before implementing code.

  • Cycle: Red → Green → Refactor.

  • JUnit is commonly used in Java TDD.


Q34. How to organize JUnit tests?
Answer:

  • By feature/module.

  • Use naming convention: ClassNameTest

  • Separate unit vs integration tests.


Q35. How to handle timeouts in JUnit?

@Test(timeout = 1000) // milliseconds
public void testTimeout() { ... }

Q36. How to test asynchronous code in JUnit 5?
Answer:
Use CompletableFuture with assertions:

@Test
void testAsync() throws Exception {
    CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello");
    assertEquals("Hello", future.get());
}

Q37. How to ignore specific tests in Maven build?
Answer:
Use @Ignore or exclude in pom.xml:

<exclude>**/IgnoredTest.java</exclude>

Q38. How to assert floating point numbers?

assertEquals(3.14, result, 0.01); // delta allowed

Q39. How to assert arrays/lists equality?

int[] expected = {1,2,3};
int[] actual = {1,2,3};
assertArrayEquals(expected, actual);

Q40. How to test exceptions and messages in JUnit 5?

Exception exception = assertThrows(IllegalArgumentException.class, () -> myMethod(null));
assertEquals("Input cannot be null", exception.getMessage());

Q41. Best Practices for JUnit Freshers:

  • Write independent tests (no shared state).

  • Keep tests fast and small.

  • Use meaningful names for test methods.

  • Prefer assertions over print statements.

  • Follow AAA pattern: Arrange → Act → Assert.

Experienced Interview Questions

 

1. Basics of JUnit

Q1. What is JUnit?
Answer:
JUnit is a unit testing framework for Java that helps in writing and running repeatable tests. Key features:

  • Annotations to identify test methods

  • Assertion methods to verify expected outcomes

  • Test suites to group tests

  • Integration with IDEs, build tools, and CI/CD pipelines


Q2. What are the differences between JUnit 3, 4, and 5?
Answer:

Feature JUnit 3 JUnit 4 JUnit 5
Annotations None, uses naming conventions (testXXX) @Test, @Before, @After @Test, @BeforeEach, @AfterEach, @BeforeAll, etc.
Test Class Inheritance Must extend TestCase No inheritance required No inheritance required
Suite Support TestSuite class @RunWith(Suite.class) @Suite annotations
Assumptions & Assertions Limited Assertions via Assert Assertions & Assumptions class

Q3. What is a unit test?
Answer:
A unit test validates a small, isolated piece of code, usually a single method or class, without external dependencies.

  • Goal: Ensure correctness, catch regressions, and facilitate refactoring.

  • Should be fast, repeatable, and independent.


Q4. What are the benefits of using JUnit?
Answer:

  • Early bug detection

  • Simplifies regression testing

  • Encourages modular design

  • Supports automated testing and CI/CD

  • Standard framework for Java developers


2. JUnit Annotations

Q5. Explain commonly used JUnit 4 annotations.
Answer:

  • @Test → Marks a method as a test

  • @Before → Runs before each test method

  • @After → Runs after each test method

  • @BeforeClass → Runs once before all tests, method must be static

  • @AfterClass → Runs once after all tests, method must be static

  • @Ignore → Ignores a test

  • @RunWith → Specifies a custom test runner


Q6. Difference between @Before and @BeforeClass?
Answer:

  • @Before: Executes before each test method; instance methods

  • @BeforeClass: Executes once before all test methods; static method

  • Use @BeforeClass for expensive setup like database connections


Q7. Difference between @After and @AfterClass?
Answer:

  • @After: Cleans up after each test method

  • @AfterClass: Cleans up once after all tests


Q8. How do you ignore a test in JUnit 4?
Answer:
Use the @Ignore annotation.

@Ignore("Waiting for bug #123 fix")
@Test
public void testFeatureX() {
    // test code
}

Q9. How can you specify expected exceptions in JUnit 4?
Answer:

@Test(expected = ArithmeticException.class)
public void testDivideByZero() {
    int x = 1 / 0;
}
  • Test passes if the exception occurs; fails otherwise.


Q10. How do you set a timeout for a test in JUnit 4?
Answer:

@Test(timeout = 1000) // milliseconds
public void testLongOperation() {
    // code that should finish within 1 second
}
  • Fails if the test exceeds the timeout


Q11. What is the @RunWith annotation?
Answer:

  • Specifies a custom test runner

  • Common runners:

    • Parameterized.class → Run tests with multiple sets of data

    • SpringJUnit4ClassRunner.class → For Spring integration tests


Q12. What is the @Rule annotation?
Answer:

  • Allows adding custom behavior to tests, like:

    • Temporary files

    • Expected exceptions

    • Timeout handling

  • Example:

@Rule
public ExpectedException thrown = ExpectedException.none();

3. Assertions

Q13. What are commonly used JUnit assertions?
Answer:

  • assertEquals(expected, actual) → Compares equality

  • assertTrue(condition) → Verifies true

  • assertFalse(condition) → Verifies false

  • assertNull(object) → Checks null

  • assertNotNull(object) → Checks not null

  • assertArrayEquals(expectedArray, actualArray) → Array equality

  • fail("message") → Force test failure


Q14. Difference between assertEquals and assertSame?
Answer:

  • assertEquals → Checks value equality (equals() method)

  • assertSame → Checks object reference equality


Q15. Difference between assertTrue(condition) and assumeTrue(condition)?
Answer:

  • assertTrue → Fails the test if condition is false

  • assumeTrue → Skips the test if condition is false


Q16. How do you test floating-point values?
Answer:

  • Use delta for precision:

assertEquals(3.14, actualValue, 0.01);
  • Delta defines the acceptable error range


Q17. How do you test collections in JUnit 4?
Answer:

  • Use assertEquals for exact match

  • Use assertTrue(collection.contains(element)) for partial checks

  • Can combine with Hamcrest matchers:

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
assertThat(list, hasItem("foo"));

4. Parameterized Tests

Q18. How do you run parameterized tests in JUnit 4?
Answer:

  • Use @RunWith(Parameterized.class) and provide @Parameters method:

@RunWith(Parameterized.class)
public class MathTest {
    @Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][] {
            {1,2,3}, {2,3,5}, {3,5,8}
        });
    }

    private int a, b, expected;

    public MathTest(int a, int b, int expected) {
        this.a = a;
        this.b = b;
        this.expected = expected;
    }

    @Test
    public void testAdd() {
        assertEquals(expected, a+b);
    }
}

Q19. What are the limitations of parameterized tests in JUnit 4?
Answer:

  • All tests share the same constructor

  • Cannot combine with @BeforeClass (static only)

  • Test names are not descriptive by default


5. Advanced Testing Concepts

Q20. How do you test private methods?
Answer:

  • Best practice: Test through public methods

  • Alternative: Use reflection (not recommended)

  • Example:

Method method = MyClass.class.getDeclaredMethod("privateMethod");
method.setAccessible(true);
Object result = method.invoke(obj);

Q21. How do you test exceptions dynamically?
Answer:

  • Using ExpectedException Rule:

@Rule
public ExpectedException thrown = ExpectedException.none();

@Test
public void testExceptionMessage() {
    thrown.expect(IllegalArgumentException.class);
    thrown.expectMessage("Invalid input");
    myMethod();
}

Q22. How do you test multi-threaded code?
Answer:

  • Use ExecutorService to run threads

  • Use CountDownLatch for synchronization

  • Combine with timeout for tests


Q23. How do you test integration with Spring?
Answer:

  • Use @RunWith(SpringJUnit4ClassRunner.class)

  • Use @ContextConfiguration for loading beans

  • Example:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class ServiceTest {
    @Autowired
    private MyService service;
}

Q24. How do you test JDBC code?
Answer:

  • Use in-memory databases like H2 for unit tests

  • Example:

JdbcTemplate jdbc = new JdbcTemplate(dataSource);
assertEquals(1, jdbc.queryForObject("SELECT COUNT(*) FROM users", Integer.class));

Q25. What is test fixture in JUnit?
Answer:

  • Fixed state before each test

  • Initialized using @Before and cleaned up using @After

  • Example: opening a DB connection before tests


Q26. How do you test code that depends on system time?
Answer:

  • Use dependency injection for clock

  • Example: Clock clock instead of new Date()

  • Can use Mockito to mock time


Q27. How do you verify method calls in tests?
Answer:

  • Use mocking frameworks like Mockito:

verify(mockObject, times(1)).someMethod();

Q28. What are best practices for JUnit testing?
Answer:

  • One assertion per test ideally

  • Tests should be independent

  • Use meaningful test names

  • Avoid testing external systems (mock dependencies)

  • Keep tests fast


Q29. How do you test private fields?
Answer:

  • Using reflection or exposing via getters (preferred)


Q30. How do you run a subset of tests in JUnit?
Answer:

  • Use @Category annotation and Categories runner

  • Run only tests with a specific category


Q31. What is the difference between JUnit 4 and JUnit 5 assertions?
Answer:

  • JUnit 5 has more expressive assertions

  • Supports lambdas for lazy message evaluation

  • Example:

assertThrows(IllegalArgumentException.class, () -> myMethod());

Q32. How do you organize test suites in JUnit 4?
Answer:

@RunWith(Suite.class)
@Suite.SuiteClasses({TestClass1.class, TestClass2.class})
public class AllTests { }

Q33. How do you mock objects in JUnit 4?
Answer:

  • Use Mockito annotations:

@Mock
MyService service;

@Before
public void initMocks() {
    MockitoAnnotations.initMocks(this);
}

Q34. Difference between spy() and mock() in Mockito?
Answer:

  • mock() → Creates a fake object; all methods stubbed

  • spy() → Partial mock; real methods invoked unless stubbed


Q35. How do you test code with dependencies like REST calls?
Answer:

  • Mock HTTP client using Mockito or WireMock

  • Use dependency injection to inject mocks


Q36. How do you test code that throws multiple exceptions?
Answer:

  • Use ExpectedException Rule or try-catch with assertions


Q37. How do you test private constructors (singleton)?
Answer:

  • Reflection can be used to invoke private constructors

  • Avoid breaking singleton in production


Q38. How do you verify order of method calls?
Answer:

  • Use Mockito InOrder verification:

InOrder inOrder = inOrder(mock1, mock2);
inOrder.verify(mock1).first();
inOrder.verify(mock2).second();

Q39. How do you test code that uses static methods?
Answer:

  • Use PowerMockito to mock static methods:

PowerMockito.mockStatic(StaticClass.class);
when(StaticClass.staticMethod()).thenReturn("value");

Q40. How do you handle flaky tests?
Answer:

  • Identify external dependencies (DB, network)

  • Use mocks

  • Retry failed tests for intermittent failures

  • Improve test isolation


Q41. How do you measure code coverage in JUnit tests?
Answer:

  • Use tools like JaCoCo, Cobertura

  • Integrated with Maven/Gradle CI/CD pipelines