Why do the Sinon stubs get carried to the next tests even after restore() is called?

I have a test case in which I stub a function using Sinon. However, it seems like Sinon doesn't restore or clear the previous stub in the next test even when I call the restore() method.

For example in the following code, I've stubbed getData() in Util in the first test with nullTestData. However, in the next test, getData() is still stuck to resolving to nullTestData when I would have expected it to resolve to notNullTestData.

describe('test data', () => {
    beforeEach(() => {
        const sandbox = sinon.createSandbox();
        sandbox.stub(Util, 'getData').resolves('some test');
    })

    afterEach(() => {
        sandbox.restore();
    })
    it('data is null', async () => {
        const nullTestData = {
            data: null
        };
        Util.getData.restore();
        sandbox.stub(Util, 'getData').resolves(nullTestData);
        // Util.getData() resolves to nullTestData with data: null
    });

    it('data is not null', async () => {
        const notNullTestData = {
            data: ['a', 'b', 'c']
        };
        Util.getData.restore();
        sandbox.stub(Util, 'getData').resolves(notNullTestData);
        //Util.getData() remains as nullTestData when it should be notNullTestData. This is weird.
    });
})

How can I restore and reset the Sinon stubs created in the previous test so that it doesn't carry forward in the next test?