当尝试在下面测试我的updateFoos方法(使用mongo上的spring更新字段List<Foo> foos )时,它使用一个带有Foo模拟列表的StackOverflowError失败。它适用于Foo的实际实例。
春季材料的版本:
以下是更新方法:
public void updateFoos(String id, List<Foo> foos) {
mongoOps.updateFirst(query(where(FIELD_ID).is(id)),
new Update().set(FIELD_FOOS, foos),
clazz);
}下面是一个测试:
@Test
public void givenPersistedBar_whenUpdateFoos_thenUpdatesThem() {
List<Foos> foos = Collections.nCopies(10, mock(Foo.class));
barDao.updateFoos(ID, foos);
}这是堆叠痕迹
java.lang.StackOverflowError
at java.security.AccessController.doPrivileged(Native Method)
at java.io.FilePermission.init(FilePermission.java:203)
at java.io.FilePermission.<init>(FilePermission.java:277)
at sun.net.www.protocol.file.FileURLConnection.getPermission(FileURLConnection.java:225)
at sun.net.www.protocol.jar.JarFileFactory.getPermission(JarFileFactory.java:156)
at sun.net.www.protocol.jar.JarFileFactory.getCachedJarFile(JarFileFactory.java:126)
at sun.net.www.protocol.jar.JarFileFactory.get(JarFileFactory.java:81)
at sun.net.www.protocol.jar.JarURLConnection.connect(JarURLConnection.java:122)
at sun.net.www.protocol.jar.JarURLConnection.getInputStream(JarURLConnection.java:152)
at java.net.URL.openStream(URL.java:1045)
at java.lang.ClassLoader.getSystemResourceAsStream(ClassLoader.java:1331)
at java.lang.Class.getResourceAsStream(Class.java:2221)
at org.springframework.core.LocalVariableTableParameterNameDiscoverer.inspectClass(LocalVariableTableParameterNameDiscoverer.java:101)
at org.springframework.core.LocalVariableTableParameterNameDiscoverer.getParameterNames(LocalVariableTableParameterNameDiscoverer.java:87)
at org.springframework.core.PrioritizedParameterNameDiscoverer.getParameterNames(PrioritizedParameterNameDiscoverer.java:65)
at org.springframework.data.mapping.model.PreferredConstructorDiscoverer.buildPreferredConstructor(PreferredConstructorDiscoverer.java:109)
at org.springframework.data.mapping.model.PreferredConstructorDiscoverer.<init>(PreferredConstructorDiscoverer.java:74)
at org.springframework.data.mapping.model.BasicPersistentEntity.<init>(BasicPersistentEntity.java:93)
at org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity.<init>(BasicMongoPersistentEntity.java:75)
at org.springframework.data.mongodb.core.mapping.MongoMappingContext.createPersistentEntity(MongoMappingContext.java:91)
at org.springframework.data.mongodb.core.mapping.MongoMappingContext.createPersistentEntity(MongoMappingContext.java:39)
at org.springframework.data.mapping.context.AbstractMappingContext.addPersistentEntity(AbstractMappingContext.java:299)
at org.springframework.data.mapping.context.AbstractMappingContext$PersistentPropertyCreator.createAndRegisterProperty(AbstractMappingContext.java:489)
at org.springframework.data.mapping.context.AbstractMappingContext$PersistentPropertyCreator.doWith(AbstractMappingContext.java:446)
at org.springframework.util.ReflectionUtils.doWithFields(ReflectionUtils.java:689)
at org.springframework.data.mapping.context.AbstractMappingContext.addPersistentEntity(AbstractMappingContext.java:314)
...发布于 2018-01-15 07:22:19
Spring分析要存储在数据库中的实体。为此,它使用反射查看要存储的类的属性。
模拟最有可能具有形成循环的属性。最有可能的是,类似于对模拟应该如何运行的信息的引用,也有对模拟的引用。因此,你得到了一个无限循环。
如果您想知道所涉及的确切属性是什么,只需在堆栈跟踪中提到的行处放置一个断点,然后进行调试即可。
要解决这个问题,不要使用模拟。我不太清楚为什么要使用模拟来测试存储库。如果您不想测试存储库,但是有些代码使用存储库来模拟存储库。
https://stackoverflow.com/questions/48229052
复制相似问题