我有以下 Java 类:
public class FooServiceImpl {
private BarService barService;
public String generateFoo() {
String barValue = barService.generateBar();
return customFoo() + barValue;
}
public String customFoo() {
return "abc";
}
}
Run Code Online (Sandbox Code Playgroud)
这是示例性的 Spock 测试方法:
def "generate foo bar"() {
setup:
def barService = Mock(BarService) {
generateBar() >> "Bar"
}
FooServiceImpl spyFooService =
Spy(FooServiceImpl, constructorArgs: [[barService: barService]])
spyFooService.customFoo() >> "foo"
when:
def fooValue = spyFooService.generateFoo()
then:
fooValue == "fooBar"
}
Run Code Online (Sandbox Code Playgroud)
我尝试为FooServiceImpl
类创建一个 Spy 对象,但出现以下错误:
org.codehaus.groovy.runtime.metaclass.MissingPropertyExceptionNoStack:
No such property: barService for …
Run Code Online (Sandbox Code Playgroud) 我从反应式存储库中获取Mono<FooBar>
基于它的值,我必须创建另外两个对象,使用反应式存储库保存它们,修改FooBar
对象并保存它。
由于我是反应式编程的新手,我使用了以下解决方案,该解决方案有效,但我不确定我是否正确使用了反应式 API:
@Test
void createAndSave() {
Mono<FooBar> fooBarMono = findFooBar() // returns Mono<FooBar>
.map(fooBar -> {
createAndSaveLoremBar(fooBar).subscribe(); // returns Mono<LoremBar>
createAndSaveDoloremBar(fooBar).subscribe(); // returns Mono<DoloremBar>
fooBar.setActive(true);
return saveFooBar(fooBar); // returns Mono<FooBar>
}).flatMap(Function.identity());
StepVerifier.create(fooBarMono)
.expectNextMatches(Objects::nonNull)
.expectComplete()
.verify();
}
Run Code Online (Sandbox Code Playgroud)
从控制台日志:
saved lorem bar
saved dolorem bar
saved foo bar
Run Code Online (Sandbox Code Playgroud) 我为使用动态编程找出最长的公共子序列的方法创建了一个基准:
@Benchmark
def longestCommonSubsequenceDP(): String = {
val s1 = "Pellentesque lacinia"
val s2 = "Mauris purus massa"
val up = 1
val left = 2
val charMatched = 3
val s1Length = s1.length()
val s2Length = s2.length()
val lcsLengths = Array.fill[Int](s1Length + 1, s2Length + 1)(0)
for (i <- 0 until s1Length) {
for (j <- 0 until s2Length) {
if (s1.charAt(i) == s2.charAt(j)) {
lcsLengths(i + 1)(j + 1) = lcsLengths(i)(j) + 1
} else {
if (lcsLengths(i)(j …
Run Code Online (Sandbox Code Playgroud) 我有一条简单的路线,例如:
from("direct:fooBar")
.pollEnrich()
.simple("file:in/?fileName=abc.txt")
.process(exchange -> {
// 1
exchange.getIn().getBody(String.class);
})
.split(body().tokenize("\n")).streaming().stopOnException()
.process(exchange -> {
// 2
exchange.getIn().getBody(String.class);
})
Run Code Online (Sandbox Code Playgroud)
abc.txt
这是一个非常大的文件,因此我正在使用split
并streaming
减少内存开销。但是我可以抓取文件的内容1
,因此我猜想使用时整个内容实际上都已加载到了内存中poolEnrich
。
我的假设正确吗?