用弹簧方面模拟物体

时间:2018-03-16 16:12:13

标签: java spring testing spring-aop easymock

我有一个测试类:

@RunWith(EasyMockRunner.class) 
public class TestClass{

@TestSubject
private AdDataCollector collector = new DefaultAdDataCollector();
...

@Test
public void check() {
    .. some logic ...

    expect().andReturn();
    expect().andReturn();
    replay(...);
    Map<,> result = collector.collect(...);
    verify(...);
    assertTrue(...)
}

这样的方面:

@Aspect
public class SafeUriInterceptor {

@Autowired
private UriConverterUtil uriConverterUtil;

@Around("execution(public * *(..)) && @annotation(SafeUrl) && args(param)")
public void proceedMethodWithSafeUrl(ProceedingJoinPoint joinPoint, String param) throws Throwable {
    String encodedValue = uriConverterUtil.encodeUriString(param);
    joinPoint.proceed(new Object[] { encodedValue });
}

@Around("execution(public * *(..)) && @annotation(SafeUrl) && args(uriList)")
public void proceedMethodWithSafeUrlList(ProceedingJoinPoint joinPoint, List<String> uriList) throws Throwable {
    List<String> encodedUriStrList = uriList != null
            ? uriList.stream().map(uriConverterUtil::encodeUriString).collect(Collectors.toList())
            : null;
    joinPoint.proceed(new Object[] { encodedUriStrList });
}
}

value.collect(...)内的测试类中,此方面执行操作。这个方法做了很多事情,它需要安全的URL,因此它使用方面。简而言之,方法的概念是:

public Map<,> collect() {
    Map<String,Apple> map = new HashMap<>();
    ...
    String unsafeUrl = "http://";
    apple.setValue(unsafeUrl);
    map.put(key, apple);
      ...

}

在方法apple.setValue(unsafeUrl)方面执行(我不完全理解为什么在测试中调用它)。 我得到NullPointerException,因为UriConverterUtil为空。 我试图模仿UriConverterUtil,但这并没有帮助。我嘲笑的对象和方面SafeUriInterceptor内的对象是不同的对象。我仍然得到NullPointerException。

如果在没有方面的情况下调用内部测试方法,我该怎么办?或者我如何在方面UriConverterUtil内模仿SafeUriInterceptor?还是有其他解决方案吗?

这是我的maven依赖,aspectj-maven-plugin

<plugins>
     <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.11</version>
            <configuration>
                <complianceLevel>1.8</complianceLevel>
                <source>1.8</source>
                <target>1.8</target>
                <weaveDependencies>
                    <weaveDependency>
                        <groupId>...</groupId>
                        <artifactId>...</artifactId>
                    </weaveDependency>
                </weaveDependencies>
                <aspectLibraries>
                    <aspectLibrary>
                        <groupId>...</groupId>
                        <artifactId>...</artifactId>
                    </aspectLibrary>
                </aspectLibraries>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                        <goal>test-compile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>           
</plugins>

可能的解决方案

因此,我可以猜测的一个解决方案是检查:uriConverterUtil是否为空。在所有测试中它都是null。如果它为null我可以执行没有uri修改的方法。

0 个答案:

没有答案