def METHOD_NAME(backend_class):
    # Arrange
    n_part = 100000
    v_mean = 2e-6
    d = 1.2
    n_sd = 32
    spectrum = Lognormal(n_part, v_mean, d)
    v, n = Linear(spectrum).sample(n_sd)
    T = np.full_like(v, 300.0)
    n = discretise_multiplicities(n)
    particulator = DummyParticulator(backend_class, n_sd)
    attribute = {"multiplicity": n, "volume": v, "temperature": T, "heat": T * v}
    particulator.build(attribute)
    true_mean, true_var = spectrum.stats(moments="mv")
    # TODO #217 : add a moments_0 wrapper
    moment_0 = particulator.backend.Storage.empty((1,), dtype=float)
    moments = particulator.backend.Storage.empty((1, 1), dtype=float)
    # Act
    particulator.moments(moment_0=moment_0, moments=moments, specs={"volume": (0,)})
    discr_zero = moments[0, slice(0, 1)].to_ndarray()
    particulator.moments(moment_0=moment_0, moments=moments, specs={"volume": (1,)})
    discr_mean = moments[0, slice(0, 1)].to_ndarray()
    particulator.moments(moment_0=moment_0, moments=moments, specs={"volume": (2,)})
    discr_mean_radius_squared = moments[0, slice(0, 1)].to_ndarray()
    particulator.moments(
        moment_0=moment_0, moments=moments, specs={"temperature": (0,)}
    )
    discr_zero_T = moments[0, slice(0, 1)].to_ndarray()
    particulator.moments(
        moment_0=moment_0, moments=moments, specs={"temperature": (1,)}
    )
    discr_mean_T = moments[0, slice(0, 1)].to_ndarray()
    particulator.moments(
        moment_0=moment_0, moments=moments, specs={"temperature": (2,)}
    )
    discr_mean_T_squared = moments[0, slice(0, 1)].to_ndarray()
    # Assert
    assert abs(discr_zero - 1) / 1 < 1e-3
    assert abs(discr_mean - true_mean) / true_mean < 0.01e-1
    true_mrsq = true_var + true_mean**2
    assert abs(discr_mean_radius_squared - true_mrsq) / true_mrsq < 0.05e-1
    assert discr_zero_T == discr_zero
    assert discr_mean_T == 300.0
    np.testing.assert_approx_equal(discr_mean_T_squared, 300.0**2, significant=6)