Mocking an if condition within a for loop in JUnit

joshskkim

I am trying to mock a method using Mockito and JUnit. For some reason it keeps saying that the embedded method is never being invoked, despite the test fulfilling the if statement.

Here is my method that I am testing:

    public List<LifeProduct> prune(List<LifeProduct> products) {
        for (LifeProduct product : products) {
            int id = product.getProductAnalyticsIdentifier();
            boolean deleteAnnuity = id > 10014;
            boolean deleteLifeInsurance = product.getLifeInsurance()
                .getHighLevelLifeInsuranceGroupName()
                .equals("string");
            
            if (deleteAnnuity) {
                annuityService.deleteAnnuityById(id);
            }
            if (deleteLifeInsurance) {
                lifeInsuranceService.deleteLifeInsuranceById(id);
            }
        }
        
        return products;
    }

and here is my test with the iterator setup:

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
  
        when(mockList.iterator()).thenReturn(mockIterator);
        when(mockIterator.hasNext()).thenReturn(true, false);
        when(mockIterator.next()).thenReturn(mockProduct);
    }

    @Test
    public final void testPrune() throws Exception {
        for (LifeProduct mockProduct : mockList) {
            mockProduct.setProductAnalyticsIdentifier(99999999);
            doNothing().when(annuityService).deleteAnnuityById(anyInt());
            List<LifeProduct> response = lifeProductDelegate.prune(mockList);
            assertNotNull(response);
            verify(annuityService).deleteAnnuityById(anyInt());
        }
    }
Tom

Your test has two issues:

You're using the mockList and therefore use one of the two values for mockIterator.hasNext()

You say that when mockIterator.hasNext() is called, it should first return true and then false. The issue here is that your test method iterates over mockList and therefore needs to call mockIterator.hasNext() and then uses the first, the true, value. The tested method #prune() then also attempts to iterate the list, but will only get the second, the false, value, thus skipping the loop. You don't need the loop in your test method, so you can and should remove it.

You incorrectly setup mockProduct

The second issue is mockProduct.setProductAnalyticsIdentifier(99999999). mockProduct is a mock, so the methods don't do anything when not configured for example via when(mockProduct...).... So the value 99999999 is not stored anywhere and #getProductAnalyticsIdentifier() in the test returns 0, the default value. What you actually want to do is to configure the getter method, for example with:

when(mockProduct.getProductAnalyticsIdentifier()).thenReturn(999999);

Now the mockProduct will return that value when #prune() asks for the id and later compares it with 10014.

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

TOP Ranking

  1. 1

    Failed to listen on localhost:8000 (reason: Cannot assign requested address)

  2. 2

    Loopback Error: connect ECONNREFUSED 127.0.0.1:3306 (MAMP)

  3. 3

    How to import an asset in swift using Bundle.main.path() in a react-native native module

  4. 4

    pump.io port in URL

  5. 5

    Compiler error CS0246 (type or namespace not found) on using Ninject in ASP.NET vNext

  6. 6

    BigQuery - concatenate ignoring NULL

  7. 7

    ngClass error (Can't bind ngClass since it isn't a known property of div) in Angular 11.0.3

  8. 8

    ggplotly no applicable method for 'plotly_build' applied to an object of class "NULL" if statements

  9. 9

    Spring Boot JPA PostgreSQL Web App - Internal Authentication Error

  10. 10

    How to remove the extra space from right in a webview?

  11. 11

    java.lang.NullPointerException: Cannot read the array length because "<local3>" is null

  12. 12

    Jquery different data trapped from direct mousedown event and simulation via $(this).trigger('mousedown');

  13. 13

    flutter: dropdown item programmatically unselect problem

  14. 14

    How to use merge windows unallocated space into Ubuntu using GParted?

  15. 15

    Change dd-mm-yyyy date format of dataframe date column to yyyy-mm-dd

  16. 16

    Nuget add packages gives access denied errors

  17. 17

    Svchost high CPU from Microsoft.BingWeather app errors

  18. 18

    Can't pre-populate phone number and message body in SMS link on iPhones when SMS app is not running in the background

  19. 19

    12.04.3--- Dconf Editor won't show com>canonical>unity option

  20. 20

    Any way to remove trailing whitespace *FOR EDITED* lines in Eclipse [for Java]?

  21. 21

    maven-jaxb2-plugin cannot generate classes due to two declarations cause a collision in ObjectFactory class

HotTag

Archive