A private method is a method that can only be accessed within the class it is declared in. It is hidden from other classes to protect internal implementation.
Click to reveal answer
beginner
Should you test private methods directly in JUnit?
Usually, no. Private methods are tested indirectly through public methods that use them. Testing private methods directly can break encapsulation and make tests fragile.
Click to reveal answer
intermediate
How can you test private methods if absolutely necessary?
You can use reflection to access private methods in tests, but this is discouraged because it makes tests harder to maintain and breaks encapsulation.
Click to reveal answer
intermediate
What is a better alternative to testing private methods directly?
Refactor the code to move complex logic into package-private or public helper classes or methods, so they can be tested directly without breaking encapsulation.
Click to reveal answer
beginner
Why is testing private methods directly considered a bad practice?
Because it tightly couples tests to the internal implementation, making tests fragile and harder to maintain when the code changes internally but behavior stays the same.
Click to reveal answer
What is the recommended way to test private methods in Java using JUnit?
ATest them indirectly through public methods
BUse reflection to call them directly
CChange their access modifier to public
DIgnore testing private methods
✗ Incorrect
Private methods should be tested indirectly through public methods that use them to keep encapsulation intact.
Which of the following is a risk of testing private methods directly?
ATests are easier to write
BTests run faster
CTests become tightly coupled to implementation details
DTests cover more code
✗ Incorrect
Directly testing private methods couples tests to internal details, making them fragile.
What Java feature can be used to access private methods in tests, though it is discouraged?
AAnnotations
BInheritance
CInterfaces
DReflection
✗ Incorrect
Reflection allows access to private methods but breaks encapsulation and is discouraged for testing.
If a private method contains complex logic, what is a good practice?
AMake the private method public
BRefactor the logic into a separate class with public methods
CSkip testing that logic
DDuplicate the logic in the test
✗ Incorrect
Refactoring complex logic into testable public methods improves testability and design.
Why might changing a private method to public just for testing be a bad idea?
AIt exposes internal details unnecessarily
BIt improves encapsulation
CIt makes the code run slower
DIt reduces code coverage
✗ Incorrect
Changing access to public exposes internal details and breaks encapsulation.
Explain why testing private methods directly is discouraged and how you should test their behavior instead.
Think about how private methods relate to the class's public interface.
You got /4 concepts.
Describe how reflection can be used to test private methods and why it is generally not recommended.
Reflection is a powerful tool but can cause maintenance issues.
You got /4 concepts.
Practice
(1/5)
1. Why is it generally discouraged to write JUnit tests that directly test private methods?
easy
A. Because private methods cannot be accessed by JUnit at all.
B. Because private methods are implementation details and should be tested indirectly through public methods.
C. Because testing private methods requires special annotations that are not supported.
D. Because private methods always contain trivial code that doesn't need testing.
Solution
Step 1: Understand the role of private methods in design
Private methods are internal helpers meant to support public methods and are not part of the class's external behavior.
Step 2: Consider testing best practices
Tests should focus on the behavior exposed by public methods, ensuring private methods work correctly as part of that behavior.
Final Answer:
Because private methods are implementation details and should be tested indirectly through public methods. -> Option B
Quick Check:
Test behavior, not private code [OK]
Hint: Test public methods to cover private ones indirectly [OK]
Common Mistakes:
Trying to access private methods directly with reflection
Assuming private methods don't need testing at all
Confusing private with protected or public methods
2. Which of the following is a correct way to test private methods in JUnit without changing their access modifier?
easy
A. Use reflection to invoke the private method directly in the test.
B. Change the private method to public and test it directly.
C. Test the private method indirectly by calling the public method that uses it.
D. Use a special JUnit annotation @TestPrivate to test private methods.
Solution
Step 1: Review JUnit capabilities
JUnit does not provide a built-in annotation to test private methods directly.
Step 2: Identify best practice
Testing private methods indirectly through public methods is the recommended approach without changing access modifiers or using reflection.
Final Answer:
Test the private method indirectly by calling the public method that uses it. -> Option C
Quick Check:
Test via public interface [OK]
Hint: Test private logic through public methods only [OK]
Common Mistakes:
Using reflection unnecessarily
Changing method visibility just for testing
Expecting JUnit to support private method testing directly
3. Consider the following Java class snippet:
public class Calculator {
private int multiply(int a, int b) {
return a * b;
}
public int square(int x) {
return multiply(x, x);
}
}
Which JUnit test will correctly verify the multiply method's behavior without accessing it directly?
medium
A. Assert.assertEquals(6, new Calculator().square(2));
B. Assert.assertEquals(9, new Calculator().multiply(3, 3));
C. Assert.assertEquals(6, new Calculator().multiply(2, 3));
D. Assert.assertEquals(9, new Calculator().square(3));
Solution
Step 1: Identify accessible methods
The multiply method is private and cannot be called directly in tests.
Step 2: Use public method that calls private method
The square method calls multiply internally, so testing square indirectly tests multiply.
Final Answer:
Assert.assertEquals(9, new Calculator().square(3)); -> Option D
Quick Check:
Test private via public method [OK]
Hint: Test private logic by calling public methods that use it [OK]
Common Mistakes:
Trying to call private method directly in test
Confusing expected results for square vs multiply
Using wrong assertion values
4. You have the following test code trying to test a private method using reflection:
Method method = Calculator.class.getDeclaredMethod("multiply", int.class, int.class);
method.setAccessible(true);
int result = (int) method.invoke(new Calculator(), 2, 3);
Assert.assertEquals(6, result);
What is a potential problem with this approach?
medium
A. Reflection breaks encapsulation and makes tests fragile to implementation changes.
B. The method.invoke call will always throw an exception for private methods.
C. JUnit does not support assertions on reflection results.
D. Private methods cannot be found by getDeclaredMethod.
Solution
Step 1: Understand reflection usage
Reflection can access private methods but bypasses normal access control, breaking encapsulation.
Step 2: Consider test maintenance impact
Tests using reflection are fragile because private method signatures or logic changes can break tests even if public behavior is unchanged.
Final Answer:
Reflection breaks encapsulation and makes tests fragile to implementation changes. -> Option A
Quick Check:
Reflection risks fragile tests [OK]
Hint: Avoid reflection; test behavior via public methods [OK]
Common Mistakes:
Assuming reflection is always safe for testing
Believing private methods cannot be accessed by reflection
Ignoring test maintenance costs
5. You have a class with complex private methods that are hard to test indirectly. What is the best approach to make testing easier while following good design and testing principles?
hard
A. Refactor the complex private methods into a new public helper class and test that class directly.
B. Make all private methods public temporarily during testing and revert after tests.
C. Use reflection to test private methods directly in all test cases.
D. Ignore testing private methods since they are internal and assume they work.
Solution
Step 1: Identify testing challenges with complex private methods
Complex private methods can be difficult to test indirectly and may indicate design issues.
Step 2: Apply refactoring for better testability
Extracting complex logic into a new public helper class allows direct testing and improves code clarity.
Final Answer:
Refactor the complex private methods into a new public helper class and test that class directly. -> Option A
Quick Check:
Refactor for testable public classes [OK]
Hint: Extract complex logic to public classes for easier testing [OK]
Common Mistakes:
Changing access modifiers just for tests
Overusing reflection for private method testing
Skipping tests for complex private logic
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.