1

I am not able do proper mock one of the AWS translation client due to expending nested abstract class:

Java class

import com.amazonaws.services.comprehend.AmazonComprehend;
import com.amazonaws.services.translate.AmazonTranslate;
public class TestLambdaFunctionHandler implements RequestHandler<InputPayLoadPojo, Response> {

AmazonTranslate awsTranslateClient = null;
AmazonComprehend comprehendClient = null;
awsTranslateClient = AmazonTranslateClientBuilder.standard().build();
comprehendClient = AmazonComprehendClientBuilder.standard().build();
........
}

Junit test class

import com.amazonaws.services.comprehend.AmazonComprehend;
import com.amazonaws.services.translate.AmazonTranslate;
import com.amazonaws.services.comprehend.AmazonComprehendClientBuilder;
import com.amazonaws.services.translate.AmazonTranslateClientBuilder;

import org.junit.Before;
import org.junit.Test;


import static org.mockito.Mockito.*;
import junit.framework.TestCase;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;


import static com.google.common.util.concurrent.Runnables.doNothing;
import static org.powermock.api.mockito.PowerMockito.whenNew;

@RunWith(PowerMockRunner.class)
@PowerMockIgnore({ "javax.net.ssl.*" })
@PrepareForTest({AmazonComprehendClientBuilder.class, AmazonComprehendClientBuilder , AmazonTranslate.class, AmazonComprehend.class,})
public class SynchronousTest {

                @Before
                public void setup() {

                }

                @Test
                public void testSynchronousTranslation() {
                                TaaSSyncLambdaFunctionHandler obj = Mockito.spy(new TaaSSyncLambdaFunctionHandler()); 
                

                                AmazonTranslate awsTransMock = PowerMockito.mock(AmazonTranslate.class);
                                AmazonComprehend awsComprehendMock = PowerMockito.mock(AmazonComprehend.class);
                                AmazonTranslateClientBuilder awsTranslateClientBuilderMock = PowerMockito.mock(AmazonTranslateClientBuilder.class);
                                AmazonComprehendClientBuilder awsComprehendClientBuilderMock = PowerMockito.mock(AmazonComprehendClientBuilder.class);
                                                                
                                when(awsTranslateClientBuilderMock.standard().build()).thenReturn(awsTransMock);
                                when(awsComprehendClientBuilderMock.standard().build()).thenReturn(awsComprehendMock);
                ...................
                }
}

error:

com.amazonaws.SdkClientException: Unable to find a region via the region provider chain. Must provide an explicit region in the builder or setup environment to supply a region.
                at com.amazonaws.client.builder.AwsClientBuilder.setRegion(AwsClientBuilder.java:386)
                at com.amazonaws.client.builder.AwsClientBuilder.configureMutableProperties(AwsClientBuilder.java:352)
                at com.amazonaws.client.builder.AwsSyncClientBuilder.build(AwsSyncClientBuilder.java:46)
                at taas.amazonservices.lambda.SynchronousTest.testSynchronousTranslation(SynchronousTest.java:89)
                at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
                at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
                at java.lang.reflect.Method.invoke(Method.java:498)
                at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
                at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:326)
                at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89)
                at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:97)
                at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:310)
                at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:131)
                at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100(PowerMockJUnit47RunnerDelegateImpl.java:59)
                at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner$TestExecutorStatement.evaluate(PowerMockJUnit47RunnerDelegateImpl.java:147)
                at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.evaluateStatement(PowerMockJUnit47RunnerDelegateImpl.java:107)
                at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
                at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:298)
                at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87)
                at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50)
                at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:218)
                at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:160)
                at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:134)
                at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
                at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
                at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:136)
                at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:121)
                at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:57)
                at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)
                at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
                at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
                at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
                at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
                at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)

After investigation found that AmazonTranslateClientBuilder extends abstract classs AwsSyncClientBuilder and AwsSyncClientBuilder extends abstract class.

This is found below.

            public final class AmazonTranslateClientBuilder extends AwsSyncClientBuilder<AmazonTranslateClientBuilder, AmazonTranslate> {
            public abstract class AwsSyncClientBuilder<Subclass extends AwsSyncClientBuilder, TypeToBuild> extends AwsClientBuilder<Subclass, TypeToBuild> {
                            

even after adding below mock for abstract class, still getting same error:

   AwsSyncClientBuilder cut= Mockito.mock(AwsSyncClientBuilder.class,Mockito.CALLS_REAL_METHODS);
   AwsClientBuilder cut1= Mockito.mock(AwsClientBuilder.class,Mockito.CALLS_REAL_METHODS);
                            

Please provide any technical to resove these type of class.

Thanks, Ranjit Kumar

Ranjit
  • 235
  • 2
  • 13

0 Answers0